Una cartilla booleana rápida para Bash
La if
afirmación adquiere un comando como argumento (como lo hacen &&
, ||
etc.). El código de resultado entero del comando se interpreta como booleano (0 / nulo = verdadero, 1 / más = falso).
La test
declaración toma operadores y operandos como argumentos y devuelve un código de resultado en el mismo formato que if
. Es un alias de la test
declaración [
, que a menudo se usa if
para realizar comparaciones más complejas.
Las declaraciones true
y false
no hacen nada y devuelven un código de resultado (0 y 1, respectivamente). Por lo tanto, pueden usarse como literales booleanos en Bash. Pero si coloca las declaraciones en un lugar donde se interpretan como cadenas, se encontrará con problemas. En tu caso:
if [ foo ]; then ... # "if the string 'foo' is non-empty, return true"
if foo; then ... # "if the command foo succeeds, return true"
Entonces:
if [ true ] ; then echo "This text will always appear." ; fi;
if [ false ] ; then echo "This text will always appear." ; fi;
if true ; then echo "This text will always appear." ; fi;
if false ; then echo "This text will never appear." ; fi;
Esto es similar a hacer algo así como echo '$foo'
frente echo "$foo"
.
Cuando se usa la test
declaración, el resultado depende de los operadores utilizados.
if [ "$foo" = "$bar" ] # true if the string values of $foo and $bar are equal
if [ "$foo" -eq "$bar" ] # true if the integer values of $foo and $bar are equal
if [ -f "$foo" ] # true if $foo is a file that exists (by path)
if [ "$foo" ] # true if $foo evaluates to a non-empty string
if foo # true if foo, as a command/subroutine,
# evaluates to true/success (returns 0 or null)
En resumen , si solo desea probar algo como pasar / fallar (también conocido como "verdadero" / "falso"), entonces pase un comando a su declaración if
o &&
etc., sin corchetes. Para comparaciones complejas, use corchetes con los operadores adecuados.
Y sí, soy consciente de que no hay tal cosa como un tipo booleano nativo en Bash, y que if
e [
y true
son técnicamente "comandos" y no "declaraciones"; Esta es solo una explicación muy básica y funcional.