Was bedeutet "wenn!" bedeuten?

7

Ich bin auf eine if / then-Aussage wie diese gestoßen:

if ! foo ; then
        echo "blah" 
        exit 1
fi

Was bedeutet konkret if !? "Wenn das Ergebnis von foonicht wahr ist?" "Wenn der Exit-Code von foonicht 0 ist"?

Mike B.
quelle
1
if !ist die Kurzform von es sei denn : -O
Jens
es ist wieif !=
jgr208
@Jens Booleans sind viel einfacher zu verstehen, wenn Sie es als sehen ! foo(unabhängig davon, ob es in einem ist ifoder nicht).
IQAndreas
@IQAndreas Ich glaube, das ist meistens eine persönliche Präferenz. Zumindest hat Perl ein eingebautes unlessSchlüsselwort und einige Leute mögen es.
Jens

Antworten:

16

!kehrt die Bedeutung des Exit-Status des Befehls um - es ist Teil der POSIX-Shell-Syntax, es ist nicht Teil von if. Aus der POSIX-Spezifikation :

Wenn das reservierte Wort! nicht vor der Pipeline, der Exit-Status ist der Exit-Status des letzten in der Pipeline angegebenen Befehls. Andernfalls ist der Exit-Status das logische NICHT des Exit-Status des letzten Befehls. Das heißt, wenn der letzte Befehl Null zurückgibt, ist der Beendigungsstatus 1; Wenn der letzte Befehl größer als Null zurückgibt, ist der Exit-Status Null.

Chris Down
quelle
11

Es ist ein boolescher Operator, der dem logischen nicht entspricht .

Siehe man bash:

! Ausdruck
    Wahr, wenn Ausdruck falsch ist.

Wenn nicht foo, geben Sie in Ihrem Beispiel ein Echo an blah.

Jasonwryan
quelle
6

Nur um die anderen Antworten zu ergänzen, verwendet der Code !, um zu vermeiden, dass der Code wie folgt geschrieben wird:

if foo ; then
    # everything that used to follow "fi" in the previous version
else
    echo "blah" 
    exit 1
fi

Das funktioniert nur , wenn es ist etwas , nach dem fiim Skript, da eine leere ifKlausel nicht legal ist. (Ein Kommentar zählt nicht.)

Das Schreiben auf diese Weise kostet Sie eine Einrückungsstufe, von der die Leute mit der strukturierten Hardcore- Programmierung sagen, dass es sich lohnt, sie zu bezahlen. Diese Schule der Softwareentwicklung sagt, dass eine exitmitten in einem Programm kaum besser ist als goto end, und da gotoes sich um ein absolutes Übel handelt, ist die zusätzliche Verschachtelungsstufe eine Verbesserung.

Eine konkurrierende Schule sagt: "Ja, Einrückungen sind großartig, bis Sie den gesamten Code von der rechten Seite des Bildschirms entfernt haben."

Dann bekommt man diejenigen, die beide Lager für ein bisschen verrückt halten und einfach beobachten, dass es besser ist, negative Logik zu vermeiden, wenn dies möglich ist, und dass der Normalfall der erste sein sollte, mit Ausnahmen am Ende des Programms.

Wählen Sie Ihre Kool-Hilfe und trinken Sie es.

Warren Young
quelle