Operador ternario (? :) en Bash

¿Hay alguna manera de hacer algo como esto?

int a = (b == 5) ? c : d; 

usando Bash?

? : operador ternario ? : ? : es solo una forma corta de if/else

 case "$b" in 5) a=$c ;; *) a=$d ;; esac 

O

  [[ $b = 5 ]] && a="$c" || a="$d" 

Código:

 a=$([ "$b" == 5 ] && echo "$c" || echo "$d") 

Si la condición es simplemente verificar si se establece una variable, incluso hay una forma más corta:

 a=${VAR:-20} 

asignará a valor de VAR si VAR está configurado; de lo contrario, le asignará el valor predeterminado 20 ; 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”.

 (( a = b==5 ? c : d )) # string + numeric 
 if [ "$b" -eq 5 ]; then a="$c"; else a="$d"; fi 

El cond && op1 || op2 cond && op1 || op2 expresión cond && op1 || op2 sugerida en otras respuestas tiene un error inherente: si op1 tiene un estado de salida distinto de cero, op2 silenciosamente se convierte en el resultado; el error tampoco se detectará en el modo -e . Por lo tanto, esa expresión solo es segura de usar si op1 nunca puede fallar (por ej., : true si es una asignación incorporada o variable sin ninguna operación que pueda fallar (como llamadas de división y de sistema operativo)).

Tenga en cuenta las "" comillas. El primer par evitará un error de syntax 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.

 [ $b == 5 ] && { a=$c; true; } || a=$d 

Esto evitará ejecutar la parte después || por accidente cuando el código entre && y || falla

El comando let admite la mayoría de los operadores básicos que uno necesitaría:

 let a=b==5?c:d; 

Naturalmente, esto funciona solo para asignar variables; no puede ejecutar otros comandos.

Aquí hay otra opción donde solo tiene que especificar la variable que está asignando una vez, y no importa si lo que asigna es una cadena o un número:

 VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B` 

Solo un pensamiento. 🙂

 (ping -c1 localhost&>/dev/null) && { echo "true"; } || { echo "false"; } 

Lo siguiente parece funcionar para mis casos de uso:

Ejemplos

 $ tern 1 YES NO YES $ tern 0 YES NO NO $ tern 52 YES NO YES $ tern 52 YES NO 52 NO 

y se puede usar en un script como ese:

 RESULT=$(tern 1 YES NO) echo "The result is $RESULT" 

golondrina

 function show_help() { echo "" echo "usage: BOOLEAN VALUE_IF_TRUE VALUE_IF_FALSE {FALSE_VALUE}" echo "" echo "eg " echo "" echo "tern 1 YES NO => YES" echo "tern 0 YES NO => NO" echo "tern "" YES NO => NO" echo "tern "ANY STRING THAT ISNT 1" YES NO => NO" echo "ME=$(tern 0 YES NO) => ME contains NO" echo "" exit } if [ "$1" == "help" ] then show_help fi if [ -z "$3" ] then show_help fi # Set a default value for what is "false" -> 0 FALSE_VALUE=${4:-0} function main { if [ "$1" == "$FALSE_VALUE" ]; then echo $3 exit; fi; echo $2 } main "$1" "$2" "$3" 

Puedes usar esto si quieres una syntax similar

 a=$(( $((b==5)) ? c : d )) 

Aquí hay algunas opciones:

1- Usar if then else en una línea, es posible.

 if [[ "$2" == "raiz" ]] || [[ "$2" == '.' ]]; then pasta=''; else pasta="$2"; fi 

2- Escribe una función como esta:

  # Once upon a time, there was an 'iif' function in MS VB ... function iif(){ # Echoes $2 if 1,banana,true,etc and $3 if false,null,0,'' case $1 in ''|false|FALSE|null|NULL|0) echo $3;;*) echo $2;;esac } 

usar script interno como este

 result=`iif "$expr" 'yes' 'no'` # or even interpolating: result=`iif "$expr" "positive" "negative, because $1 is not true"` 

3- Inspirado en la respuesta del caso, un uso más flexible y de una línea es:

  case "$expr" in ''|false|FALSE|null|NULL|0) echo "no...$expr";;*) echo "yep $expr";;esac # Expression can be something like: expr=`expr "$var1" '>' "$var2"` 

Podemos usar las siguientes tres formas en Shell Scripting para operador ternario:

  [ $numVar == numVal ] && resVar="Yop" || resVar="Nop" Or resVar=$([ $numVar == numVal ] && echo "Yop" || echo "Nop") Or (( numVar == numVal ? (resVar=1) : (resVar=0) ))