Eine schnelle boolesche Grundierung für Bash
Die if
Anweisung nimmt einen Befehl als Argument (wie auch &&
, ||
etc.). Der ganzzahlige Ergebniscode des Befehls wird als Boolescher Wert interpretiert (0 / null = true, 1 / else = false).
Die test
Anweisung verwendet Operatoren und Operanden als Argumente und gibt einen Ergebniscode im gleichen Format wie zurück if
. Ein Alias der test
Anweisung ist [
, mit dem häufig if
komplexere Vergleiche durchgeführt werden.
Die Anweisungen true
und false
tun nichts und geben einen Ergebniscode zurück (0 bzw. 1). So können sie in Bash als boolesche Literale verwendet werden. Wenn Sie die Anweisungen jedoch an einer Stelle platzieren, an der sie als Zeichenfolgen interpretiert werden, treten Probleme auf. In deinem Fall:
if [ foo ]; then ... # "if the string 'foo' is non-empty, return true"
if foo; then ... # "if the command foo succeeds, return true"
So:
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;
Dies ist vergleichbar mit so etwas wie tun echo '$foo'
vs. echo "$foo"
.
Bei Verwendung der test
Anweisung hängt das Ergebnis von den verwendeten Operatoren ab.
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)
Kurz gesagt , wenn Sie nur als Pass - Test etwas wollen / nicht bestanden (auch bekannt als „true“ / „false“), übergeben Sie dann einen Befehl an Ihrer if
oder &&
usw. Anweisung, ohne Klammern. Verwenden Sie für komplexe Vergleiche Klammern mit den richtigen Operatoren.
Und ja, ich bin mir bewusst, dass es in Bash keinen nativen booleschen Typ gibt, und das if
und [
und true
sind technisch "Befehle" und keine "Anweisungen"; Dies ist nur eine sehr grundlegende, funktionale Erklärung.