¿Hay alguna manera de hacer algo como esto?
int a = (b == 5) ? c : d;
usando Bash?
bash
syntax
conditional-operator
En_t8
fuente
fuente
bash
tiene algo similar al "operador ternario", sin embargo, enbash
esto se llama el "operador condicional"expr?expr:expr
(vea laman bash
sección de "Evaluación aritmética"). Tenga en cuenta que elbash
"operador condicional" es complicado y tiene algunas trampas.((...))
. Ver Shell Aritmética .$(( ))
aritmética y evaluación aritmética(( ))
. Ver tambiénhttps://mywiki.wooledge.org/ArithmeticExpression
.Respuestas:
operador ternario
? :
es solo una forma corta deif/else
O
fuente
=
operador prueba la igualdad de cadenas, no la igualdad numérica ([[ 05 = 5 ]]
es decir, es falsa). Si desea una comparación numérica, use-eq
en su lugar.if/then/else
cond && op1 || op2
construcción tiene un error inherente: siop1
tiene un estado de salida distinto de cero por cualquier razón, el resultado se convertirá en silencioop2
.if cond; then op1; else op2; fi
es una línea también y no tiene ese defecto.Código:
fuente
echo "$c"
es un comando con varias líneas con alias (comoecho 1; echo 2
), debe encerrarlo entre paréntesis.&&
no tendrá un estado de salida distinto de cero. De lo contrario,a && b || c
se ejecutará "inesperadamente"c
sia
tiene éxito perob
falla.Si la condición es simplemente verificar si se establece una variable, incluso hay una forma más corta:
asignará al
a
valor deVAR
siVAR
está configurado, de lo contrario le asignará el valor predeterminado20
; esto también puede ser el resultado de una expresión.Como señala Alex en el comentario, este enfoque se denomina técnicamente "Expansión de parámetros".
fuente
a=${1:-'my-hyphenated-text'}
:-
)${VAR:-yes:-no}
.La
cond && op1 || op2
expresión sugerida en otras respuestas tiene un error inherente: siop1
tiene un estado de salida distinto de cero, enop2
silencio se convierte en el resultado; el error tampoco se detectará en el-e
modo. Entonces, esa expresión solo es segura de usar siop1
nunca puede fallar (por ejemplo:
,true
si una orden interna, o la asignación de variables sin ningún tipo de operaciones que pueden fallar (como la división y llamadas OS)).Tenga en cuenta las
""
citas. El primer par evitará un error de sintaxis si$b
está en blanco o tiene espacios en blanco. Otros evitarán la traducción de todos los espacios en blanco en espacios individuales.fuente
[ "x$b" -eq "x" ]
solía probar específicamente la cadena vacía. Me gusta usar las sintaxis utilizadas por zsh ('EXPANSIÓN DE PARÁMETROS' en la página de manual de zshexpn) pero no sé mucho sobre su portabilidad.fuente
(( ))
trata cualquiera / todas las cadenas como0
a=$(( b==5 ? c : d ))
Esto evitará ejecutar la parte después de || por accidente cuando el código entre && y || falla
fuente
-e
modo:(set -o errexit; [ 5 == 5 ] && { false; true; echo "success"; } || echo "failure"; echo $?; echo "further on";)
->success 0 further on
:
bulit-in en lugar detrue
guardarexec
un programa externo.&&
...||
y aún atrapar un comando fallido entre ellos?&&
y,||
por definición, se aplican a todo el comando antes que ellos. Entonces, si tiene dos comandos antes (independientemente de cómo se combinen), no puede aplicarlo solo a uno de ellos y no al otro. Usted puede emularif
/then
/else
lógica con variables bandera, pero ¿por qué molestarse si hayif
/then
/else
adecuada?El comando let admite la mayoría de los operadores básicos que uno necesitaría:
Naturalmente, esto funciona solo para asignar variables; No puede ejecutar otros comandos.
fuente
Aquí hay otra opción donde solo tiene que especificar la variable que está asignando una vez, y no importa si su asignación es una cadena o un número:
Solo un pensamiento. :)
fuente
[ test ]
. Por lo tanto, la construcción solo es segura de usar si "sabe" que el comando no genera nada para stdout.VARIABLE="`[ test ] && echo \"VALUE_A\" || echo \"VALUE_B\"`"
.Lo siguiente parece funcionar para mis casos de uso:
Ejemplos
y se puede usar en un script como este:
golondrina de mar
fuente
tern
parte de Bash? Mac no parece tenerlochmod 700 tern
en la misma carpeta. Ahora tendrá untern
comando en su terminalPodemos usar las siguientes tres formas en Shell Scripting para el operador ternario:
fuente
También hay una sintaxis muy similar para condicionales ternarios en bash:
Desafortunadamente, solo funciona con números, que yo sepa.
fuente
fuente
Puede usar esto si desea una sintaxis similar
fuente
a=$(((b==5) ? : c : d))
-$((...))
sólo se necesita cuando queremos asignar el resultado de la aritmética a otra variable.Aquí hay algunas opciones:
1- Use si luego en una línea, es posible.
2- Escribe una función como esta:
use guiones internos como este
3- Inspirado en la respuesta del caso, un uso más flexible y de una línea es:
fuente
Aquí hay una solución general, que
Prueba con comparación numérica
a = $(if [ "$b" -eq 5 ]; then echo "$c"; else echo "$d"; fi)
Prueba con comparación de cadenas
a = $(if [ "$b" = "5" ]; then echo "$c"; else echo "$d"; fi)
fuente
Esto es muy parecido a la buena respuesta de Vladimir . Si su "ternario" es un caso de "si es verdadero, cadena, si es falso, vacío", entonces simplemente puede hacer:
fuente
para responder a:
int a = (b == 5) ? c : d;
solo escribe:
recuerda que "expresión" es equivalente a $ ((expresión))
fuente
Una alternativa orientada a cadenas, que usa una matriz:
que salidas:
fuente