Beide scheinen BASH zu signalisieren, mit einem anderen Befehl zu beginnen, der den Symbolen folgt. Gibt es jedoch einen deutlichen Unterschied?
command-line
bash
Michael Terry
quelle
quelle
Sie können den Unterschied selbst ausprobieren:
ls /invalid/path && echo "hello!"
Da / invalid / path nicht existiert, kann ls die Verzeichnisliste nicht anzeigen. Es wird mit einer Fehlermeldung fehlschlagen: "ls: / invalid / path: Keine solche Datei oder Verzeichnis".
Die zweite Hälfte des Befehls (Echo "Hallo!") Wird nie ausgeführt, da die erste Hälfte fehlgeschlagen ist.
ls /invalid/path ; echo "hello!"
Es erscheint die gleiche Fehlermeldung wie zuvor, diesmal wird jedoch der zweite Teil ausgeführt !
ls: / invalid / path: Keine solche Datei oder Verzeichnis
hallo!
Warum ist das nützlich?
Angenommen, Sie möchten eine Datei mit dem Namen archive.tar.gz extrahieren.
Sie könnten den Befehl verwenden
tar zxvf archive.tar.gz && rm archive.tar.gz
.Wenn das Extrahieren des Archivs aus irgendeinem Grund fehlschlägt, wird der zweite Teil nicht ausgeführt! Sie können es erneut versuchen.
Wenn du benutzt ; In der gleichen Situation wird das Archiv gelöscht und Sie können es nicht erneut versuchen.
quelle
&&
istAND
, was bedeutet, dass der zweite Befehl nur ausgeführt wird, wenn der erste true zurückgegeben hat (keine Fehler).quelle
AND
Ausführung der 2. Parameter irrelevant wird, wenn der erste gleich ist,false
und so der zugrunde liegende Code optimiert wird, um die Bewertung des 2. Parameters zu verschieben, bis er weiß, was der erste ist.&&
ist nur ein binärer Operator, eine Funktion. Das einzige "Besondere" ist, dass es sich um die Infixnotation (die ohnehin für die meisten dieser Operatortypen Standard ist) und die verzögerte Ausführung des zweiten Operanden handelt. Die verzögerte Ausführung gibt ihm in der Tat die Fähigkeit , als etwas zu verwenden , die vom Konzept her als betrachtet werden könnenif
Aussage in diesem Zusammenhang , aber das dauert nicht weg von der Tatsache , dass es ursprünglich Nutzung bestimmt ist , ist innerhalb der bedingten einer tatsächlichenif
Anweisung. Die Verwendung hier ist wirklich eher ein "Hack".a && b || c = (a && b) || c
. Einfache Reihenfolge der Auswertung. Da gibt es wirklich kein Geheimnis. Wenn Sie sie wie Ihre typischen Funktionen schreiben würden, würde es einfach so aussehenor(and(a, b), c)
. Diese Logik ist die gleiche innerhalb einerif
bedingten sowie , wenn es direkt in die Befehlszeile eingeben , da&&
und||
sind Operatoren , sie umfassen zwei Operanden und sie kehren anderen.Update : Ich habe einige der möglichen Fallen als Skript hinzugefügt:
Weil sonst niemand "||" erwähnt hat, werde ich
Update2 : Einige wichtige Umformulierungen hier
&& sind wie ein "dann" einer "wenn" -Anweisung, die auf "wahr" reagiert.
|| ist NICHT wie das "else" einer "if" -Anweisung ..
|| ist wie ein "dann" einer "wenn" -Anweisung, die auf "falsch" reagiert
Genauer gesagt, testet && das $? Rückgabewert der
vorherigenzuletzt ausgeführten Anweisung und übergibt die Steuerung an der Anweisung oder Unterschale unmittelbar nach dem && ... es geht nur die Kontrolle , wenn $? ist wahr.|| ähnlich ist, und wird häufig nach einer && Anweisung gesehen, aber es testet für einen falschen Rückgabewert ($?) von der
vorherigenzuletzt ausgeführten Anweisung ... NB! , Nota Bene! Gut zu beachten! .... wenn die vorhergehende Anweisung eine &&-Anweisung ist, die false wiederholt, wenn Sie erwarten, dass es true ist, dann || wird auf false reagieren, daher kann es riskant sein, beide in derselben Zeile zu mischenDer Hauptgrund, den ich zu machen versuche, ist in Bezug auf einen Fehler, den ich gemacht habe. dh:
## [[Bedingung]] && A || B
ist nicht benimmt sich nicht wie ein C / C ++ Stil ternäre. dh:
// (Bedingung)? A: B
Im folgenden Skript finden Sie Beispiele für "unerwartete" Ergebnisse von "A".
Der Basistest und das && und das || Anweisung muss alle in der gleichen Zeile sein ...
Führen Sie dieses Skript aus, um festzustellen, wo bei Verwendung von && und || Probleme auftreten können
Die zuletzt ausgeführte Anweisung ist möglicherweise nicht die erwartete.
[[Bedingung]] && echo Hallo || echo Goodbye .... ist normalerweise sicher,
da ein gut geformtes Echo true zurückgibt.
aber was ist mit dem Zugriff auf eine Datei, die nicht existiert?
quelle
Versuchen
und
sieh den Unterschied
quelle
Der Befehl (Funktion im Falle eines Skripts) danach
&&
wird abhängig vom RETVAL des ersten Befehls (Funktion im Falle eines Skripts) ausgeführt. Erzwingt bei Erfolg, dass der erste Befehl den Wert 0 zurückgibt. Wir können den Rückgabewert überprüfen, um weitere Befehle auszuführen.quelle