Primer Booleano Rápido para Bash
A ifdeclaraçã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 testinstrução aceita operadores e operandos como argumentos e retorna um código de resultado no mesmo formato que if. Um alias da testdeclaração é [, que é frequentemente usado ifpara realizar comparações mais complexas.
As instruções truee falsenã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 testinstruçã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 ifou &&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 ife [e truesão tecnicamente "comandos" e não "declarações"; essa é apenas uma explicação funcional muito básica.