scripts script resueltos programas pasar parametros operaciones manejo espaƱol ejercicios ejemplos comandos cadenas aritmeticas bash equals zero

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