sirve - Bash si[falso]; devuelve verdadero
pasar parametros shell script (4)
Una cartilla booleana rápida para Bash
La instrucción if
toma un comando como argumento (como do &&
, ||
, etc.). El código de resultado entero del comando se interpreta como booleano (0 / null = verdadero, 1 / else = falso).
La instrucción de test
toma operadores y operandos como argumentos y devuelve un código de resultado en el mismo formato que if
. Un alias de la declaración de test
es [
, que a menudo se usa con if
para realizar comparaciones más complejas.
Los enunciados true
y false
no hacen nada y devuelven un código de resultado (0 y 1, respectivamente). Entonces 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"
Asi que:
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 como echo ''$foo''
vs. echo "$foo"
.
Cuando se utiliza la declaración de test
, 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 quiere probar algo como aprobado / no aprobado (también conocido como "verdadero" / "falso"), pase un comando a su instrucción if
o &&
etc., sin corchetes. Para comparaciones complejas, utilice corchetes con los operadores adecuados.
Y sí, soy consciente de que no existe el tipo de booleano nativo en Bash, y que if
y [
y true
son técnicamente "comandos" y no "enunciados"; esta es solo una explicación básica y funcional.
He estado aprendiendo bash esta semana y me encontré con un problema.
#!/bin/sh
if [ false ]; then
echo "True"
else
echo "False"
fi
Esto siempre arrojará True, aunque la condición parezca indicar lo contrario. Si elimino los corchetes []
entonces funciona, pero no entiendo por qué.
Descubrí que puedo hacer algo de lógica básica ejecutando algo como:
A=true
B=true
if ($A && $B); then
C=true
else
C=false
fi
echo $C
El uso de verdadero / falso elimina el desorden del soporte ...
#! /bin/bash
# true_or_false.bash
[ "$(basename $0)" == "bash" ] && sourced=true || sourced=false
$sourced && echo "SOURCED"
$sourced || echo "CALLED"
# Just an alternate way:
! $sourced && echo "CALLED " || echo "SOURCED"
$sourced && return || exit
Está ejecutando el comando [
(aka test
) con el argumento "falso", sin ejecutar el comando false
. Como "falso" es una cadena no vacía, el comando de test
siempre tiene éxito. Para ejecutar realmente el comando, suelte el [
comando.
if false; then
echo "True"
else
echo "False"
fi