
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. if
prüft dann den Rückgabestatus von [[
. Wenn keine Operatoren an übergeben werden [[
, -n
wird 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 expr
Anweisung (ohne Klammern) prüft den Rückgabestatus, expr
nachdem sie als Bash-Befehl ausgewertet wurde. Bei Erfolg wird sie als true
Wert 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/file
das 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 test
Befehl 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 expr
und 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).