Was ist der Unterschied zwischen if und [[ in Bash?

Was ist der Unterschied zwischen if und [[ in Bash?

Ich sehe das

if cmd
then
echo Hi
fi

funktioniert anders als

if [[ $(cmd) ]]
then
echo Hi
fi

Was passiert also, wenn ein [[ vorhanden ist und wenn nicht?

Antwort1

In der Shell [gibt es einen Alias ​​für den Testbefehl. ErIstder Befehl. Dies [[ist eine Funktion einiger Shells, die nur geringfügig anders ist. In Bash ist es ein Schlüsselwort und kein Befehl, funktioniert aber wie ein Befehl.

Sie können es sich so vorstellen: Sie führen [[die Ausgabe von "$(cmd)" aus und stellen sie als Argumente für diesen Befehl bereit. ifprüft dann den Rückgabestatus von [[. Wenn keine Operatoren an übergeben werden [[, -nwird dies impliziert.

   -n string
          True if the length of string is non-zero.

Für Ihre Beispiele:

if cmd          # check the return status of cmd
if [[ $(cmd) ]] # check if cmd has any output

Antwort2

Eine if exprAnweisung (ohne Klammern) prüft den Rückgabestatus, exprnachdem sie als Bash-Befehl ausgewertet wurde. Bei Erfolg wird sie als trueWert behandelt.

Andererseits if [[ expr ]]ist mit doppelten eckigen Klammern ein bash-spezifischerStichwortdas seinen eigenen Satz von Optionen verarbeiten kann, wie z. B. -f /path/to/filedas Testen auf Dateiexistenz oder sogar Variablentests wie $a == $b. Innerhalb dieser Klammern müssen Sie ihm explizit sagen, dass es einen Ausdruck als Satz von Bash-Befehlen mit auswerten soll if [[ $(cmds) ]]. Andernfalls wird alles dort als spezieller Ausdruck behandelt und anders analysiert.

Es gibt auch die if [ expr ]Konstruktion, die im Allgemeinen ein Alias ​​ist (oder in einigen Fällen eine ungefähre Implementierung davon) if test expr. Wenn der testBefehl eine Option zur Verfügung hat, können Sie diese auch in einzelnen Klammern verwenden.

Für mehr Spaß gibt es die if ((expr))Konstruktion, die sich am besten für den Umgang mit Zahlen eignet, da alles darin als arithmetischer Ausdruck ausgewertet wird. Dies ist auch ein Schlüsselwort, wie die doppelten Klammern.

Grundsätzlich sind if exprund if [ expr ]portabel (d. h. alle Shells können mit ihnen umgehen und behandeln sie ziemlich identisch) und if [[ expr ]]und if (( expr ))sind implementierungsspezifisch, d. h. es handelt sich um Schlüsselwörter, deren Auswertung stark von der Shell abhängt, in der Sie sie verwenden (und wenn Sie nicht so etwas wie bash, zsh, oder verwenden ksh, existieren sie möglicherweise nicht einmal).

verwandte Informationen