GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo evaluará Bash el siguiente código?

Esta pregunta tiene dos partes:

(a) Comprender qué está haciendo el código cortado

(b) Comprender la diferencia entre estado de salida y estado de devolución en contexto de bash .

Aquí está el código cortado que estoy tratando de entender:

if var=-2 && (( var+=2 ))
then
    echo "True"
else
    echo "False"
fi

Ejecutar esto produce False . No puedo entender por qué sucede esto.

Si entiendo esto correctamente, esto es lo que puede suceder con if condición:

(a) var=-2 crea un estado de salida de 0, porque la asignación es un éxito

(b) (( var+=2 )) suma 2 al valor de var y la expresión evalúa cero. Entonces, el estado de salida es 1 para este término

(c) 0 &&1 crea un estado existente de 0 que luego es utilizado por if construir

El if se supone que la construcción simplemente verifica el estado de salida y cuando es cero toma el entonces sendero. En el paso (c) anterior es cero, pero el script aún toma el else sendero. ¿Es esta la forma correcta de entender esto?

Además, sigo viendo varios bash los textos usan estado de salida y estado de retorno indistintamente.

Dudo var=-2 la asignación tendría algún tipo de estado de salida porque no es un programa. Pero cualquier aclaración sobre la diferencia entre dos será genial.

Respuesta aceptada:

Eso es:

if
  first list of commands
then
  second list of commands
else
  third list of commands
fi

Eso es para ejecutar la segunda lista de comandos si la primera lista de comandos regresa con un verdadero /éxito (cero) estado de salida, es decir, si el último comando de ejecución allí regresa con un estado de salida cero.

en:

var=-2 && ((var += 2))

Es cmd1 && cmd2 donde cmd2 solo se ejecuta si cmd1 tiene éxito.

var=-2

Por lo general, tendrá éxito siempre que $var no se ha hecho de solo lectura, por lo que ((var += 2)) se ejecutará el comando:

((arithmetic expression))

Devuelve éxito /verdadero siempre que la expresión se evalúe correctamente (sin error de sintaxis) y el resultado de la expresión sea distinto de cero.

  • ((123)) , ((1 + 1)) , ((1 == 1)) devolver verdadero
  • ((0)) , ((-2 + 2)) , ((2 == -2)) devuelve falso.
  • ((4294967296 * 4294967296)) devuelve falso en la mayoría de los shells debido al ajuste de enteros de 64 bits

var += 2 como expresión aritmética, realiza la asignación y se resuelve en el valor asignado, aquí 0, de ahí el falso estado de salida.

Puede ver el valor en el que se basa el estado de salida, utilizando el $((...)) sintaxis de expansión aritmética:

$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0

O asignándolo a una variable:

$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0

$? contiene el estado de salida del comando anterior. En cuanto a if /then /else /fi se refiere, 0 significa verdadero, cualquier otra cosa significa falso.

Relacionado:Mac:¿cómo configurar macports package bash para usar desde terminal.app?

La confusión aquí proviene del hecho de que para las expresiones aritméticas, es al revés: significa falso y cualquier otra cosa significa verdadero (por ejemplo, 2 == 2 es 1 mientras 2 < 1 es ).

Para evitar preocuparse por la diferencia, simplemente olvídese de $? y sus posibles valores. Solo piense en términos booleanos true /falso , éxito /fracaso .

 grep -q foo file

Devuelve verdadero si foo se encuentra en file .

 [ "$a" = "$b" ]

Devuelve verdadero si $a contiene lo mismo que $b .

 ((6 * 3 - 12))
 ((4 == 1))

Devuelve verdadero si el resultado de la expresión aritmética es un número distinto de cero.

No importa si esos verdaderos /falso se expresan en términos de 0 o 1 del estado de salida de esos grep /[ comandos o ((...)) construir.


Linux
  1. ¿Cómo depurar un script Bash?

  2. ¿Cómo obtener más información sobre el origen de un código de salida?

  3. ¿Cómo detectar Bash> =4.0?

  4. Cómo evaluar cadenas como números en Bash

  5. Cómo instalar R en Ubuntu 18.04

Cómo escribir un bucle en Bash

Cómo comentar en Bash

Bash break:cómo salir de un bucle

Cómo ejecutar un script Bash

Bash Prompt con el último código de salida

Código de salida de asignación de variables a sustitución de comandos en Bash