resueltos - Bash Scripting-comprueba si la variable bash es igual a 0
scripts linux ejercicios resueltos (6)
Tengo una profundidad variable bash y me gustaría probar si es igual a 0. En caso afirmativo, quiero dejar de ejecutar el script. Hasta ahora tengo:
zero=0;
if [ $depth -eq $zero ]; then
echo "false";
exit;
fi
Desafortunadamente, esto lleva a:
[: -eq: unary operator expected
(podría ser un poco inexacto debido a la traducción)
Por favor, ¿cómo puedo modificar mi script para que funcione?
Doble paréntesis (( ... ))
se usa para operaciones aritméticas.
Los corchetes dobles [[ ... ]]
se pueden usar para comparar y examinar números (solo se admiten números enteros), con los siguientes operadores:
· NUM1 -eq NUM2 returns true if NUM1 and NUM2 are numerically equal.
· NUM1 -ne NUM2 returns true if NUM1 and NUM2 are not numerically equal.
· NUM1 -gt NUM2 returns true if NUM1 is greater than NUM2.
· NUM1 -ge NUM2 returns true if NUM1 is greater than or equal to NUM2.
· NUM1 -lt NUM2 returns true if NUM1 is less than NUM2.
· NUM1 -le NUM2 returns true if NUM1 is less than or equal to NUM2.
Por ejemplo
if [[ $age > 21 ]] # bad, > is a string comparison operator
if [ $age > 21 ] # bad, > is a redirection operator
if [[ $age -gt 21 ]] # okay, but fails if $age is not numeric
if (( $age > 21 )) # best, $ on age is optional
Específicamente: ((depth))
. Por ejemplo, lo siguiente imprime 1
.
declare -i x=0
((x)) && echo $x
x=1
((x)) && echo $x
Parece que la variable de depth
está desactivada. Esto significa que la expresión [ $depth -eq $zero ]
convierte en [ -eq 0 ]
después de que bash sustituye los valores de las variables en la expresión. El problema aquí es que el operador -eq
se usa incorrectamente como operador con un solo argumento (el cero), pero requiere dos argumentos. Es por eso que recibe el mensaje de error del operador unario .
EDITAR: Como Doktor J mencionó en su comentario a esta respuesta, una forma segura de evitar problemas con las variables no establecidas en las verificaciones es incluir las variables en ""
. Vea su comentario para la explicación.
if [ "$depth" -eq "0" ]; then
echo "false";
exit;
fi
Una variable no definida utilizada con el [
comando aparece vacía para bash. Puede verificar esto usando las pruebas a continuación que todas evalúan como true
porque xyz
está vacío o no configurado:
-
if [ -z ] ; then echo "true"; else echo "false"; fi
-
xyz=""; if [ -z "$xyz" ] ; then echo "true"; else echo "false"; fi
-
unset xyz; if [ -z "$xyz" ] ; then echo "true"; else echo "false"; fi
Puedes intentar esto:
: ${depth?"Error Message"} ## when your depth variable is not even declared or is unset.
NOTA: ¿Aquí está solo ?
después de la depth
.
o
: ${depth:?"Error Message"} ## when your depth variable is declared but is null like: "depth=".
NOTA: Aquí está :?
después de la depth
.
Aquí si la depth
variable se encuentra null
, imprimirá el mensaje de error y luego saldrá.
Tratar:
zero=0;
if [[ $depth -eq $zero ]]; then
echo "false";
exit;
fi
también puede usar este formato y usar operadores de comparación como ''=='' ''<=''
if (( $total == 0 )); then
echo "No results for ${1}"
return
fi