Primer Booleano Rápido para Bash
A if
declaração tem um comando como um argumento (como fazem &&
, ||
, etc.). O código de resultado inteiro do comando é interpretado como um booleano (0 / null = true, 1 / else = false).
A test
instrução aceita operadores e operandos como argumentos e retorna um código de resultado no mesmo formato que if
. Um alias da test
declaração é [
, que é frequentemente usado if
para realizar comparações mais complexas.
As instruções true
e false
não fazem nada e retornam um código de resultado (0 e 1, respectivamente). Portanto, eles podem ser usados como literais booleanos no Bash. Mas se você colocar as instruções em um local em que elas sejam interpretadas como seqüências de caracteres, você terá problemas. No seu caso:
if [ foo ]; then ... # "if the string 'foo' is non-empty, return true"
if foo; then ... # "if the command foo succeeds, return true"
Assim:
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;
Isto é semelhante ao fazer algo como echo '$foo'
vs. echo "$foo"
.
Ao usar a test
instrução, o resultado depende dos 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)
Em resumo , se você quiser apenas testar algo como aprovado / reprovado (também conhecido como "verdadeiro" / "falso"), passe um comando para sua declaração if
ou &&
etc., sem colchetes. Para comparações complexas, use colchetes com os operadores adequados.
E sim, eu estou ciente que não há tal coisa como um tipo boolean nativa em Bash, e que if
e [
e true
são tecnicamente "comandos" e não "declarações"; essa é apenas uma explicação funcional muito básica.