¿Comparación de cadenas y números en bash en declaraciones de prueba?

¿Comparación de cadenas y números en bash en declaraciones de prueba?

No estoy seguro de esta comparación que estoy haciendo:

   if [ "$exit_status" -eq 0 ];then
   #some statements
   fi

¿Esta forma correcta de comparar números o comillas hace que la variable sea exit_statusuna cadena para compararse con 0? No sé si esto podría fallar en algún escenario.

Respuesta1

Si es correcto.

Las comillas en conchas tienen un propósito diferente que en otros idiomas. Veresta respuestapara más detalles.

En Shell, las comillas se utilizan para evitar que el Shell trate algunos caracteres de manera especial y para evitar algunas operaciones que de otro modo el Shell realizaría en algunos tipos de expansión (como en este caso la expansión de variables).

Normalmente, en este caso, desea "$exit_status"expandirlo a un argumento del [comando que es el contenido de esa variable, por lo que necesita las comillas.

Respuesta2

[ "$exit_status" -eq 0 ]es correcto si $exit_status solo contiene dígitos, y también podrías eliminar las comillas (siempre que IFS no contenga dígitos).

Si x está vacío o no está configurado, [ "$x" -eq 6 ]genera un error pero [[ "$x" -eq 6 ]]no:

$ x=; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ unset x; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ x=; [[ "$x" -eq 6 ]]
$ unset x; [[ "$x" -eq 6 ]]
$ 

Los operadores aritméticos eliminan los espacios en blanco:

$ [ '6 ' -eq $'\n\t6' ]; echo $?
0

Dentro de [[ los operandos de los operadores aritméticos son expresiones aritméticas, por lo que, por ejemplo, [[ 4 -eq 2+2 ]]es verdadero. Los números que comienzan con 0 se tratan como números octales:

$ [[ 010 -eq 8 ]]; echo $?
0
$ [ 010 -eq 8 ]; echo $?
1

A menudo uso = / == incluso para comparar números enteros. = y == son equivalentes en bash dentro de [[ y [. == y [[ no están definidos por POSIX.

La división de palabras y la expansión de nombres de rutas no se realizan dentro de [[. [[ $x = $y ]]trata y como un patrón pero [[ $x = "$y" ]]trata y literalmente:

$ x=44; y='4*'
$ [[ $x = $y ]]; echo $?
0
$ [[ $x = "$y" ]]; echo $?
1

Respuesta3

Sin embargo, citar números es de poca utilidad. Si el valor del parámetro es un número, entonces las comillas no cambian nada y si no es así, el if fallará de todos modos. Vale, no en todos los casos:

exit_status="a = a -o 0"; [ "$exit_status" -eq 0 ] # returns false
exit_status="a = a -o 0"; [ $exit_status -eq 0 ] # returns true

Esto se debe a [que es un comando integrado de bash pero, no obstante, es un comando simple, mientras que [[es un comando compuesto que cambia el análisis de la línea de comando.

información relacionada