Verwirrende Verwendung von & & und || Operatoren

Ich habe eine /etc/rc.d/init.d/sendmail -Datei durchgesehen (ich weiß, dass dies kaum jemals verwendet wird, aber ich bin es Studieren für eine Prüfung), und ich bin etwas verwirrt über die Operatoren && und ||. Ich habe gelesen, wo sie in Anweisungen wie:

if [ test1 ] && [ test2 ]; then echo "both tests are true" elif [ test1 ] || [ test2 ]; then echo "one test is true" fi 

verwendet werden können. Dieses Skript zeigt jedoch einzeilige Anweisungen wie:

[ -z "$SMQUEUE" ] && SMQUEUE="QUEUE" [ -f /usr/sbin/sendmail ] || exit 0 

Diese scheinen die Operatoren && und || zu verwenden, um Antworten basierend auf auszulösen Tests, aber ich konnte keine Dokumentation über diese spezielle Verwendung dieser Operatoren ausgraben. Kann jemand erklären, was diese in diesem speziellen Kontext tun?

Antwort

Die rechte Seite von && wird nur ausgewertet, wenn der Exit-Status der linken Seite Null ist (dh true). || ist das Gegenteil: Die rechte Seite wird nur ausgewertet, wenn der Exit-Status der linken Seite ungleich Null ist (dh falsch).

Sie können [ ... ], um ein Programm mit einem Rückgabewert zu sein. Wenn der Test im Inneren als wahr ausgewertet wird, wird Null zurückgegeben. Andernfalls wird ein Wert ungleich Null zurückgegeben.

Beispiele:

$ false && echo howdy! $ true && echo howdy! howdy! $ true || echo howdy! $ false || echo howdy! howdy! 

Zusätzliche Hinweise:

Wenn Sie , Sie sehen möglicherweise, dass [ tatsächlich auf ein Programm verweist! Es ist jedoch normalerweise nicht dasjenige, das in Skripten ausgeführt wird. Führen Sie type [ aus, um zu sehen, was tatsächlich ausgeführt wird. Wenn Sie versuchen möchten, das Programm zu verwenden, geben Sie einfach den vollständigen Pfad wie an Also: /bin/[ 1 = 1.

Kommentare

  • Wenn Sie “ X oder Y “ testen Sie X. Wenn ‚ wahr ist, kennen Sie bereits die Antwort auf “ X oder Y “ (es ‚ ist wahr), daher muss Y nicht getestet werden ‚ ist wahr, Sie ‚ kennen die Antwort auf “ X oder Y „, daher müssen Sie Y testen. Wenn Sie “ X und Y “ sehen Sie testen X. Wenn ‚ falsch ist, kennen Sie bereits die Antwort auf “ X und Y (es ‚ ist falsch), s o Sie müssen Y nicht testen. Wenn X wahr ist, müssen Sie Y testen, um festzustellen, ob “ X und Y “ ist true.
  • Anstelle von “ würde ich iv id = „schreiben, wenn die linke Seite Null zurückgibt “ 3a45b66681 „>

, wenn der Exit-Status des Befehls ‚ auf der linken Seite Null ist „. Ich finde “ return “ etwas mehrdeutig, da sowohl der Ausgabe- als auch der Exit-Status als “ Rückgabewerte „

  • Sie können nicht nur “ [ ... ] ist ein Programm „, in vielen Fällen ist . Es ist ‚ häufig in der Datei /bin/[ oder /usr/bin/[.
  • C-Programmierer werden dies sehr verwirrend finden. Dort bedeutet 0 falsch … Während in Shellscripting 0 bedeutet wahr … Verblüfft.
  • @Calmarius Wenn Sie ‚ an C gewöhnt sind, denken Sie an return Status, keine Booleschen Werte, wobei return 0 Erfolg bedeutet.
  • Antwort

    Hier ist mein Spickzettel:

    • „A; B „Führen Sie A und dann B aus, unabhängig vom Erfolg von A
    • “ A & & B „Führen Sie B aus wenn A erfolgreich war
    • „A || B „Führen Sie B aus, wenn A fehlgeschlagen ist.
    • “ A & „Führen Sie A im Hintergrund aus.

    Kommentare

    • Es gibt ‚ einige interessante Parallelen zur Lambda-Berechnung, die hier in funktionierendem JavaScript gezeigt werden (definieren Sie die Variablen in der Reihenfolge); “ links (auch bekannt als true) „: (a => b => a). “ richtig (auch bekannt als falsch) „: (a => b => b). “ A; B “ “ dann “ (a => b => (() => b())(a())). “ A & & B “ “ wenn ohne sonst (wann) “ (a => b => a()(() => right)(b)).“ A || B “ “ sonst ohne if (es sei denn) “ (a => b => a()(b)(() => right)). “ a & & b || c “ “ ifThenElse “ (a => b => c => (unless(when(a)(b))(c))())
    • Beachten Sie, dass in Bash links analog 0 / leere Zeichenfolge ist, rechts analog alles andere.
    • Was ist mit einem einzelnen vertikalen Balken?

    Antwort

    um die Antwort von @ Shawn-j-Goff von oben zu erweitern, lautet && ein logisches UND, und || ist ein logisches ODER.

    Siehe diesen Teil des Advanced Bash Scripting Guide. Einige der Inhalte des Links dienen als Benutzerreferenz (siehe unten).

    & & UND

    if [ $condition1 ] && [ $condition2 ] # Same as: if [ $condition1 -a $condition2 ] # Returns true if both condition1 and condition2 hold true... if [[ $condition1 && $condition2 ]] # Also works. # Note that && operator not permitted inside brackets #+ of [ ... ] construct. 

    || ODER

    if [ $condition1 ] || [ $condition2 ] # Same as: if [ $condition1 -o $condition2 ] # Returns true if either condition1 or condition2 holds true... if [[ $condition1 || $condition2 ]] # Also works. # Note that || operator not permitted inside brackets #+ of a [ ... ] construct. 

    Antwort

    Aus meiner Erfahrung verwende ich die & & an d || Um eine if-Anweisung auf eine einzelne Zeile zu reduzieren.

    Angenommen, wir suchen nach einer Datei mit dem Namen /root/Sample.txt, dann lautet die traditionelle Iteration in der Shell wie folgt:

    if [ -f /root/Sample.txt ] then echo "file found" else echo "file not found" fi 

    Diese 6 Zeilen können auf eine einzelne Zeile reduziert werden:

    [[ -f /root/Sample.txt ]] && echo "file found" || echo "file not found" 

    Beim Ausführen einiger Iterationen zum Festlegen von Variablen oder Um Dateien usw. zu erstellen, ist das Leben einfacher und das Skript sieht mit der einzeiligen if-Funktion schlanker aus. Der einzige Nachteil ist, dass es etwas schwieriger wird, mehrere Befehle aus einer einzigen Iteration zu implementieren. Sie können jedoch Funktionen verwenden.

    Kommentare

    • Das ist cool. Erinnert mich an Objektcode (a == b)? val = 1: val = 2;
    • Wie kann ich diesen Befehl verwenden, wenn ich einen Prozess im Hintergrund mit “ & ? Ich erhalte einen Syntaxfehler für ./someScript.sh & && echo 'ok' || echo 'ko'
    • In der Form: foo && bar || baz, if foo Wenn dies erfolgreich ist, schlägt bar fehl. baz wird ausgeführt, sodass es sich geringfügig von einem if Anweisung.
    • Ich muss beachten, dass es möglich ist, mehrere Befehle hintereinander in {} Klammern mit && oder ||, z. B.: pidof udpxy > /dev/null 2>&1 && echo "udpxy is up!" || { echo "udpxy is down!"; /etc/init.d/udpxy restart; }. Erwähnenswert ist auch, dass if..then..else ein zuverlässigerer “ Erkenner “ von true / ist falsche Bedingungen als bei Verwendung von && und ||.

    Antwort

    Es gibt den Begriff „Abkürzung“.

    Wenn (expr1 && expr2) ausgewertet wird – expr2 wird nur ausgewertet, wenn exp1“ true „ergibt. Dies liegt daran, dass sowohl expr1 als auch expr2 wahr sein müssen, damit (expr1 && expr2) wahr ist. Wenn expr1 als „false“ ausgewertet wird, wird expr2 NICHT bewertet (Verknüpfung), da (expr1 && expr2) ist bereits „flase“.

    Versuchen Sie Folgendes – nehmen Sie an, dass die Datei F1 existiert & file F2 existiert nicht:

    ( [ -s F1 ] && echo "File Exists" ) # will print "File Exists" - no short cut ( [ -s F2 ] && echo "File Exists" ) # will NOT print "File Exists" - short cut

    Ähnlich für || (oder) – aber kurz Das Schneiden ist umgekehrt.

    Kommentare

    • Die Logik wird normalerweise als “ Kurzschluss „. Ich habe ‚ noch nie die Phrase “ Abkürzung “ gesehen. Ich erwähne dies, um Referenzen zu finden.

    Antwort

    Die Beispiele in der Antwort von Shawn J. Goff sind richtig, aber die Erklärung ist umgekehrt. Bitte überprüfen Sie:

    Die rechte Seite von & & wird nur ausgewertet, wenn der Exit-Status auf der linken Seite NONZERO ist. || ist das Gegenteil: Die rechte Seite wird nur ausgewertet, wenn der Exit-Status der linken Seite NULL ist.

    Kommentare

    • Sie wissen, dass für Shells Null der Exit-Code true und damit den Exit-Code ungleich Null auf der linken Seite von && führt dazu, dass der gesamte Ausdruck false zurückgibt?
    • Jemand hat Ihre Änderungen nicht genehmigt, da dies nicht Ihre Antwort war.Wenn Sie der Meinung sind, dass eine Antwort falsch ist, sollten Sie sie ablehnen und möglicherweise einen Kommentar hinterlassen. Wenn Sie der Meinung sind, dass eine Änderung erforderlich ist, sollten Sie einen Kommentar hinterlassen. Das Bearbeiten dient zum Korrigieren von Grammatik-, Formatierungs- und Rechtschreibfehlern, die die Bedeutung der Antwort nicht ändern.
    • @countermode ‚ Es tut mir leid, Sie haben Recht. Ich dachte unter Linux null = falsch und ungleich Null = wahr (wie in C und vielen anderen Sprachen / Umgebungen / Plattformen). Ich entschuldige mich für das Missverständnis.

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.