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.