Un primer booleano rapido per Bash
La ifdichiarazione prende un comando come argomento (come fanno &&, ||e così via). Il codice risultato intero del comando viene interpretato come un valore booleano (0 / null = true, 1 / else = false).
L' testistruzione accetta operatori e operandi come argomenti e restituisce un codice risultato nello stesso formato di if. Un alias testdell'istruzione è [, che viene spesso utilizzato ifper eseguire confronti più complessi.
Le istruzioni truee falsenon fanno nulla e restituiscono un codice risultato (0 e 1, rispettivamente). Quindi possono essere usati come letterali booleani in Bash. Ma se metti le dichiarazioni in un posto in cui sono interpretate come stringhe, ti imbatterai in problemi. Nel tuo caso:
if [ foo ]; then ... # "if the string 'foo' is non-empty, return true"
if foo; then ... # "if the command foo succeeds, return true"
Così:
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;
Questo è simile a fare qualcosa di simile echo '$foo'contro echo "$foo".
Quando si utilizza l' testistruzione, il risultato dipende dagli operatori utilizzati.
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)
In breve , se vuoi semplicemente testare qualcosa come pass / fail (aka "true" / "false"), passa un comando alla tua istruzione ifo &&ecc., Senza parentesi. Per confronti complessi, utilizzare le parentesi con gli operatori appropriati.
E sì, sono consapevole che non esiste un tipo booleano nativo in Bash, e che ife [e e truetecnicamente "comandi" e non "istruzioni"; questa è solo una spiegazione molto basilare e funzionale.