bash syntax conditional-operator

Operador ternario(?:) en Bash



bash conditional (14)

¿Hay alguna manera de hacer algo como esto?

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

usando Bash?


Aquí hay algunas opciones:

1- Usar si en otra línea en otra 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 un 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"`


Aquí hay otra opción en la que 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:

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

Solo un pensamiento. :)


Código:

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


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

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

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


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 utilizar en un script como tal:

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

tern

function show_help() { echo "" echo "usage: BOOLEAN VALUE_IF_TRUE VALUE_IF_FALSE {FALSE_VALUE}" echo "" echo "e.g. " 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"


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

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


Puedes usar esto si quieres una sintaxis similar

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


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

a=${VAR:-20}

asignará a a valor de VAR si se establece VAR ; de lo contrario, le asignará el valor predeterminado 20 , que 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".


También hay una sintaxis muy similar para los condicionales ternarios en bash:

a=$(( b == 5 ? 123 : 321 ))

Desafortunadamente, solo funciona con números, que yo sepa.


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"


(( a = b==5 ? c : d )) # string + numeric


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


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

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


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 se convierte silenciosamente en el resultado; el error tampoco se detectará en modo -e . Por lo tanto, esa expresión solo es segura de usar si op1 nunca puede fallar (p. Ej., : true si es una asignación incorporada o variable sin ninguna operación que pueda fallar (como las llamadas de división y sistema operativo)).

Note 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.