Eine schnelle boolesche Grundierung für Bash
Die ifAnweisung 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 testAnweisung verwendet Operatoren und Operanden als Argumente und gibt einen Ergebniscode im gleichen Format wie zurück if. Ein Alias der testAnweisung ist [, mit dem häufig ifkomplexere Vergleiche durchgeführt werden.
Die Anweisungen trueund falsetun 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 testAnweisung 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 ifoder &&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 ifund [und truesind technisch "Befehle" und keine "Anweisungen"; Dies ist nur eine sehr grundlegende, funktionale Erklärung.