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.
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.