AND und OR im Terminal

  Ralf Hersel   Lesezeit: 6 Minuten  🗪 17 Kommentare Auf Mastodon ansehen

Mit && und || kann man im Terminal kurze und nützliche Ausdrücke kombinieren. Hier findet ihr Erklärungen, Beispiele und vermeintliche Fehler.

and und or im terminal

Dieser Artikel richtet sich an Einsteiger beim Umgang mit dem Terminal.

Neulich habe ich ein Video gesehen, bei dem es um die Verwendung der Befehle AND und OR im Terminal ging. Da ich die Logik nicht direkt verstanden habe, habe ich mich näher mit dem Thema beschäftigt. Vermutlich sind euch allen die booleschen Operatoren AND und OR aus der Schule bekannt. Üblicherweise findet man diese in bedingten Ausdrücken. Hier ist ein Pseudocode-Beispiel:

IF Zahl > 9 AND Zahl < 100 THEN print("zweistellig")

Grundlagen

Im Terminal wird der Operator AND durch && und OR durch || dargestellt. Eine mögliche Befehlszeile könnte so aussehen:

ls -e || echo 2 

Dieses Beispiel ist weniger intuitiv zu verstehen als das erste Beispiel. Um das zu verstehen, erkläre ich die Operanden der booleschen Befehle. Dabei handelt es sich immer um Ausdrücke, die einen Wahrheitswert (TRUE, FALSE) liefern. Das können Variablen, Bedingungen oder Funktionen sein:

True OR False --> True
1 AND 0 --> False
1 > 2 OR 2 > 1 --> True
function(a) AND function(b) --> True oder False

Falls ihr die booleschen Regel nicht kennt, hier sind sie (1 steht für True, 0 steht für False):

0 OR 0 = 0          0 AND 0 = 0          0 XOR 0 = 0
1 OR 0 = 1          0 AND 1 = 0          1 XOR 0 = 1
0 OR 1 = 1          1 AND 0 = 0          0 XOR 1 = 1
1 OR 1 = 1          1 AND 1 = 1          1 XOR 1 = 0

Nun schauen wir auf ein paar Beispiele im Terminal:

echo 1 || echo 2
1

Also: Ausgabe von 1 OR Ausgabe von 2. Der erste Befehl liefert einen positiven Exit-Wert (weil er funktioniert). Damit ist die OR-Bedingung erfüllt. Es genügt, wenn ein Operand True ist. Deshalb wird die 1 von echo 1 ausgegeben. Im nächsten Beispiel schlägt der erste Befehl fehl; der Exit-Wert lautet False:

ls -e || echo 2
ls: Ungültige Option -- e
2

Da der Exit-Wert des zweiten Operanden (echo 2) true ist, erhalten wir trotzdem ein Ergebnis (2), weil 0 OR 1 = True ist. Nun folgt das gleiche Spiel mit AND:

echo 1 && echo 2
1
2

Beide Operanden sind true, weshalb beide Funktionen ausgeführt werden (1, 2). Und nun das:

ls -e && echo 2
ls: Ungültige Option -- e

Hierbei wird nichts ausgegeben, weil die erste Funktion (ls -e) False liefert und damit der gesamte Ausdruck False ist.

Und jetzt lehnt sich Ralf ganz weit aus dem Fenster. Wer sich das erste Beispiel (echo 1 || echo 2) genau anschaut, stellt fest, dass der OR-Operator (||) gar kein OR, sondern ein XOR implementiert. Der Ausdruck liefert True OR True = True. Somit müsste die Ausgabe 1, 2 lauten anstatt 1. Die Ausgabe 1 ist nur möglich, wenn ein XOR-Operator zur Anwendung kommt, weil True XOR True = False ist. Damit habe ich bewiesen, dass Linux von Grund auf kaputt ist :)

Spass beiseite; ihr könnt mir bestimmt erklären, warum ich falsch denke.

Praktische Anwendung

Die bisherigen Ausführungen sind ja nett, schreien aber nach praktischen Anwendungsfällen im Terminal. Dafür gibt es viele Beispiele, wobei ich mich auf wenige beschränke (Faulheit). Angenommen, ihr möchtet eine Textdatei ausgeben, von der ihr nicht wisst, ob sie überhaupt existiert. Bitte schön:

cat text.txt && cat text.txt
cat: text.txt: Datei oder Verzeichnis nicht gefunden

echo "Das ist ein Text" > text.txt

cat text.txt && cat text.txt
Das ist ein Text
Das ist ein Text

Das mag etwas verwirrend aussehen, weshalb ich es erkläre. cat text.txt liefert False, weil es die Datei nicht gibt. Das zweite cat text.txt wird nicht ausgeführt, weil False AND irgendwas = False ergibt. Dann erzeuge ich mit echo die Datei text.txt. Nun rufe ich denselben Befehl erneut auf. Da cat text.txt zwei Zwecke hat, wird "Das ist ein Text" zweimal ausgegeben. cat prüft und gibt aus, falls vorhanden.

Wichtig ist zu wissen, dass die Funktionen in den Operanden nicht aufeinander warten. Dieser Befehl funktioniert nicht, weil mv sich ausführen will, obwohl das tar-Archiv noch nicht fertig ist:

tar -czf archiv.tar.gz /home/ralf/Dokumente && mv archive.tar.gz /home/ralf/Downloads

Hier ein praktisches Beispiel für den OR-Operator. Du weisst nicht, welcher Editor auf deinem System verfügbar ist. Dann rufe alle auf. Der erste verfügbare Editor wird gewinnen:

vim text.txt || ed text.txt || micro text.txt || nano text.txt

zsh: correct 'vim' to 'vi' [nyae]? n
zsh: correct 'ed' to 'sed' [nyae]? n
zsh: command not found: vim
zsh: command not found: ed

Fazit

Mit den Operatoren OR und AND kann man im Terminal kurze und effektive Befehle kombinieren und ausführen. Damit spart man sich das eine oder andere Shell-Skript. Die Profis mögen mich in der Luft zerreissen, aber ich bleibe dabei, das OR ist ein XOR.

Nachtrag

Dieser Artikel ist ein schönes Beispiel für die Community-Power. Wenn ich etwas schreibe, heisst das noch lange nicht, dass es richtig ist. Zum Glück gibt es viel Wissen in der Community. Hier werden Ideen durch Wissen ergänzt, weshalb die Kommentare so wichtig sind.

Mein Gedanke war, dass && und || den booleschen Operatoren entsprechen. Dabei handelt es sich um einen falschen Freund. Auf fast allen Seiten im Internet werden diese Operatoren als "boolean operators" beschrieben. Das ist falsch! Die Funktionsweise dieser Operatoren entspricht nicht AND und OR. Sie verhalten sich zwar ähnlich zu ihren booleschen Pendants, aber nicht gleich. Darin liegt die Gefahr der Missinterpretation.

&& und || (Mir fehlt der passende Name für diese Operatoren. Ich nenne sie Boolean-ähnliche Listen-Operatoren) werden nicht paarweise oder in ihrer Gesamtheit ausgewertet, sondern Stück für Stück, von links nach rechts. Hier ist ein Beispiel:

echo 1 && echo 2 && echo 3 && echo 4
1
2
3
4

Der Rückgabewert eines Befehls (wie z. B.: echo) kann erfolgreich sein (Rückgabewert = 0), oder nicht (Rückgabewert = 1 bis 255). Die 0 wird als TRUE interpretiert, alle anderen Werte (1 bis 255) werden als Fehler oder Warnungen interpretiert (FALSE). Das ist kontraintuitiv, da normalerweise 0 als FALSE und 1 (usw.) als TRUE gilt. Diese Interpretation ist sinnvoll, wenn man die Rückgabewerte (1 bis 255) auswerten möchte. Der booleschen Logik laufen diese Rückgabewerte entgegen. Egal, mit den reziproken Werten kann man leben.

Im oben gezeigten Beispiel liefern alle echo-Aufrufe den Wert TRUE. Die Logik lautet: Wenn Rückgabewert = TRUE, dann mache weiter. Da alle Befehle TRUE sind, werden alle Befehle ausgeführt. Hier ist ein Beispiel, bei dem der dritte Befehl FALSE liefert:

echo 1 && echo 2 && ls -e && echo 4
1
2
ls: Ungültige Option -- e

1 ist TRUE, also geht es weiter. 2 ist TRUE, es geht weiter. Der dritte Befehl ist ungültig und liefert einen Rückgabewert > 0. Somit ist er FALSE. Hier bricht die Kette ab. Der dritte Befehl wird mit einer Fehlermeldung abgebrochen und der vierte Befehl wird nicht ausgeführt.

Die &&-Operatoren werden nicht gesamthaft, sondern von links nach rechts ausgewertet. Bei jedem Operator wird entschieden, ob es weitergeht.

Werfen wir einen Blick auf den vermeintlichen OR-Operator: ||

echo 1 || echo 2 || ls -e || echo 4
1

Hier lautet die Logik: Wenn Rückgabewert = TRUE, dann mache es und höre danach auf. Das kommt einem komisch vor, weshalb ich noch ein Beispiel präsentiere:

ls -e || echo 2 || echo 3 || echo 4
ls: Ungültige Option -- e
2

Jetzt wird es klar: Der erste Befehl liefert FALSE, weshalb der zweite Befehl ausgeführt wird. Falls der zweite Befehl auch FALSE liefern würde, wird der dritte Befehl ausgeführt:

ls -e || ls -e || echo 3 && echo 4
ls: Ungültige Option -- e
ls: Ungültige Option -- e
3
4

Im letzten Beispiel seht ihr || und && in einer Kombination: Der erste Befehl schlägt fehl, weshalb wegen des || der zweite Befehl versucht wird. Auch dieser schlägt fehl, weshalb der dritte Befehl versucht wird (echo 3). Dieser gelingt, weshalb er ausgeführt wird. Da dieser gelingt, wird auch der vierte Befehl (TRUE) ausgeführt.

Titelbild: selbst
Quellen: keine

Tags

Terminal, AND, OR, Konsole, SHELL

blackcrack
Geschrieben von blackcrack am 30. Mai 2025 um 09:48

wird auch gern in if/fi Anweisungen genommen, wenn überprüft wird ob das oder jehnes existiert, auch bei elif , währe vielleicht ein Artikel wert, bei dem auch loops und arrays' weiter rumgespielt wird, daß die leutz sich wieder auf scripte endsinnen, vorallem die Neuankömmlinge in Linux, daß die was in der hand haben, wo sie anfangen können beim scripten..

das könnte man ja in einem Artikel "Scripts, die mächtigen automationen - Bash-Scripting einfach mal Angefangen" zusammen fassen, über einfache Befehlstaufrufe, aufbau eines bashscripts mit #!/bin/bash , was auch mit python funktioniert dann funtionen(){} wo man befehlsabläufe zusammen bauen kann und die aufrufe dann mit einfachen "funtionen" aufrufen kann im script,

ich hab mir damit ein möchtiges firstupdate-install-update-upgrade Admin script aufgebaut, das mir alles macht, daß am frisch installierten Distro gemacht werden muss um einfach drann zu sitzen und los zu legen, Das Adminscrip erkennt auch ob Virtualbox leuft oder VM-Manager und bei Virtualbos wird gleich mal nach update die VBox-Utils installiert danach das ganze System so eingerichtet, daß es alles hat und in meinem Netzwerk daheim rein passt.

Jo, Bashscripting iss ne mächtige sache :) breitgrinz

liebe Grüße Blacky

Blackysgate.de

liebe Grüße Blacky

The_Raven
Geschrieben von The_Raven am 31. Mai 2025 um 12:19

Ich mache alle meine Projekte in bash. Zum Teil hochkomplexe Sachen (z.B. Alarmanlage). Habe auch schon überlegt einen Artikel darüber zu schreiben (speziell im Zusammenspiel mit OliveTin). Das ganze ist jedoch zu sehr "Pi-Lastig" und passt daher nicht so hierher. Zudem bin ich kein guter Schreiber und es fehlt mir auch die Lust dazu.

Cleo
Geschrieben von Cleo am 30. Mai 2025 um 12:19

Die "Funktionen in den Operanden" warten im Zweifel tatsächlich nicht aufeinander.

Zwei "Kaufmanns-Und", i.e. die &&, bedeuten -zumindest kannte ich das bislang so- dass ein zweiter Befehl nur ausgeführt wird, wenn der erste fehlerfrei ausgeführt wurde, und womöglich war das ja auch gemeint.

Also der erste AND ggf. der zweite Befehl :D - ...Hoffentlich TRUE.

linuxer
Geschrieben von linuxer am 30. Mai 2025 um 13:40

Hi,

die beiden Shell-Operatoren haben zwar einen gewissen logischen Bezug, aber ich würde sie nicht mit der klassischen Logikbetrachtung AND/OR/XOR/... in Verbindung bringen.

Die bash man-page nennt es AND- und OR-Listen. Und beschreibt einfach nur das jeweilige Verhalten:

cmd1 && cmd2
cmd1 || cmd2

Das erste Kommando wird immer ausgeführt. Beim && wird das zweite Kommando nur dann ausgeführt, wenn das erste erfolgreich war. Und beim || eben nur, wenn das erste nicht erfolgreich ausgeführt werden konnte. Ja, das ist am Ende ein "Exklusiv-Oder". Aber ich würde es lockerer sehen, wie im Sprachgebrauch.

Tue dies UND tue das.
Tue dies ODER tue das, falls das "dies" nicht geklappt hat.

Deine tar und mv Aussage kann ich so nicht nachvollziehen. Bei mir wird erst das tar ausgeführt, und das mv nur, wenn das tar erfolgreich war.

Einmal mit erfolgreichen tar:

$ tar cf foo.tar a.txt b.txt && mv foo.tar archive.tar
$ echo $?
0
$ ls -lgG
total 20
-rw-r--r-- 1 10240 May 30 11:24 archive.tar
-rw-r--r-- 1    10 May 30 11:23 a.txt
-rw-r--r-- 1    10 May 30 11:24 b.txt

Das mv wurde ausgeführt, nachdem das Archiv erstellt worden ist und tar einen Erfolg per Rückgabewert gemeldet hat.

Und einmal mit fehlgeschlagenem tar:

$ rm archive.tar
$ tar cf foo.tar a.txt b.txt c.txt && mv foo.tar archive.tar
tar: c.txt: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
$ ls -lgG
total 20
-rw-r--r-- 1    10 May 30 11:23 a.txt
-rw-r--r-- 1    10 May 30 11:24 b.txt
-rw-r--r-- 1 10240 May 30 11:28 foo.tar

Hier bricht das tar bei der Erstellung ab, liefert eine Rückgabewert für NICHT-Erfolg und das mv wird nicht ausgeführt.

Der Clou ist eigentlich ja genau der, dass das zweite Kommando erst ausgeführt werden würde, wenn das erste Kommando abgeschlossen ist und einen Rückgabewert geliefert hat. Es ist abhängig vom Rückgabewert, ob das zweite Kommando ausgeführt wird.

Wenn Du Dich aber vertippst und nur ein einzelnes & angegeben hast, dann wird das erste Kommando (tar) im Hintergrund ausgeführt und derweil das zweite Kommando (mv) ausgeführt.

Falls noch nicht bekannt, der Rückgabewert eines Kommandos ist mehr als TRUE oder FALSE. Den Rückgabewert eines Kommandos sieht man, wenn man sich die Variable $? DIREKT nach dem Kommando ausgeben lässt (z.B. in der Bash, womit ich normalerweise arbeite und teste). Ein Erfolg wird mit einer 0 (Null) signalisiert, alles andere (1-255) ist ein Misserfolg und bedeutet einen Fehler. Je nach Anwendung können die Zahlen beim Misserfolg variieren, um verschiedene Fehlermöglichkeiten darzustellen.

$ tar cf foo.tar a.txt b.txt c.txt
tar: c.txt: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
$ echo $?
2

$ tar cf foo.tar a.txt b.txt
$ echo $?
0
linuxer
Geschrieben von linuxer am 30. Mai 2025 um 15:02

Was mir noch einfiel, wie man den Ablauf mit && veranschaulichen könnte:

echo 1 && sleep 5 && echo 2

Damit sollte die "1" ausgegeben werden, dann 5 Sekunden geschlafen werden, und dann sollte die "2" ausgegeben werden. Wenn die Ausgabe der "2" direkt und nicht verzögert erfolgt, hat man entweder einen Tippfehler eingebaut oder die verwendete Shell verhält sich anders als IMHO "üblich". Die drei Kommandos sollten nacheinander abgearbeitet werden, nicht parallel.

Klaus
Geschrieben von Klaus am 30. Mai 2025 um 15:13

Hallo Ralf, Du mißverstehst die Funktionalität von && und || in der Schell. Zu &&: Wenn der Ausdruck vor && erfolgreich ausgeführt werden kann, TRUE, dann und nur dann wird auch der Zweite ausgeführt. Zu ||: Wenn der Ausdruck vor || nicht erfolgreich ausgeführt werden kann, dann und nur dann führe den Zweiten aus. Du hast also Recht, indem du || als XOR bezeichnest. Entweder Ausdruck 1 oder Ausdruck 2, aber nie beide.

Klaus
Geschrieben von Klaus am 30. Mai 2025 um 15:39

Der Vergleich mit der boolschen Arithmetik hinkt insofern, als dass bei der boolschen Arithmetik immer die Ausdrücke auf beiden Seiten des Operators ausgeführt werden und dann das Ergebnis der boolschen Verknüpfung zurückgegeben wird. Das gilt hier nicht. Die erfolgeiche oder fehlgeschlagene Ausführung des 1. Operanden entscheidet darüber, wie mit dem 2. Operanden verfahren wird. Bei &&: Wurde der 1. Operand erfolgreich ausgeführt, als Fehlerstatus = 0, dann und nur dann wird auch der zweite Operand ausgeführt. Bei ||: Produziert der 1. Operand bei der Ausführung eine Fehlermeldung, Fehlerstatus nicht 0, dann und nur dann wird der 2. Operand ausgeführt.

Klaus
Geschrieben von Klaus am 30. Mai 2025 um 17:18

Der Vergleich mit der boolschen Arithmetik hinkt insofern, als dass bei der boolschen Arithmetik immer die Ausdrücke auf beiden Seiten des Operators ausgeführt werden und dann das Ergebnis der boolschen Verknüpfung zurückgegeben wird. Das gilt hier nicht. Die erfolgeiche oder fehlgeschlagene Ausführung des 1. Operanden entscheidet darüber, wie mit dem 2. Operanden verfahren wird. Bei &&: Wurde der 1. Operand erfolgreich ausgeführt, als Fehlerstatus = 0, dann und nur dann wird auch der zweite Operand ausgeführt. Bei ||: Produziert der 1. Operand bei der Ausführung eine Fehlermeldung, Fehlerstatus nicht 0, dann und nur dann wird der 2. Operand ausgeführt.

Felix
Geschrieben von Felix am 30. Mai 2025 um 18:25

Mein häufigstes Szenario für && ist ein Download der länger braucht als ich das ganze überwachen will. Zum Beispiel ein Video von YouTube mit ytdlp laden, da kommt hinten dann noch fix ein "&& shutdown -h 2:00" dran. Schon kann das Video laden und der PC geht danach aus während ich längst im Traumland unterwegs bin👍🏻

Ralf Hersel Admin
Geschrieben von Ralf Hersel am 31. Mai 2025 um 23:13

Ich habe einen Nachtrag geschrieben und bin immer noch völlig verwirrt.

Robert
Geschrieben von Robert am 1. Juni 2025 um 09:50

tar -czf archiv.tar.gz /home/ralf/Dokumente && mv archive.tar.gz /home/ralf/Downloads

Das geht nicht, weil im 2. Befehl das Archiv ein extra e hat. Dennoch wird der 2. Befehl ausgeführt, wenn der erste erfolgreich war.

Naja
Geschrieben von Naja am 1. Juni 2025 um 12:19

...und das nicht ausgeführte mv (wegen des falschen Dateinamens) hat dich vermutlich zu der falschen Aussage geführt, dass die Befehle nicht aufeinander warten. Das ist natürlich nicht richtig, denn wie soll der Folgebefehl "wissen" ob der vorige korrekt ausgeführt wurde, wenn er nicht wartet.

David
Geschrieben von David am 1. Juni 2025 um 12:53

Der Name des Archivs hat ein extra e ... nicht das Archiv selbst :) ... Der zweite Befehl wird versucht, wenn der erste erfolgreich war ... und (gehen wir davon aus) ergibt hier vermutlich dann erwartbar einen Fehler ... es sei denn es existiert auch zufälligerweise die Datei "archive.tar.gz" und "Downloads" ist als nicht vorhanden (in dem Fall entsteht die Datei Downloads) oder als Verzeichnis schreibbar.

Chris
Geschrieben von Chris am 1. Juni 2025 um 11:24

> Mein Gedanke war, dass && und || den booleschen Operatoren entsprechen.

Ich denke, das tun sie auch :)

Mal ein anderes Beispiel zur Verdeutlichung: Die meisten Leute werden sich schwer tun, eine Berechnung wie 1,234 5,678 im Kopf auszurechnen. Die Berechnung von 1,234 5,678 * 0 ist dagegen einfach. Man muss die Multiplikation der ersten beiden Faktoren nicht ausführen, um zum korrekten Ergebnis zu kommen. Dennoch ist auch das letztere immer noch eine Multiplikation.

Genauso sind boolesche Operatoren immer noch boolesche Operatoren, wenn man bei der Berechnung nur den Teil ausführt, der nötig ist, um zum korrekten Ergebnis zu kommen.

Chris
Geschrieben von Chris am 1. Juni 2025 um 11:29

> Mein Gedanke war, dass && und || den booleschen Operatoren entsprechen.

Ich denke, das tun sie auch :)

Mal ein anderes Beispiel zur Verdeutlichung: Die meisten Leute werden sich schwer tun, eine Berechnung wie 1,234 * 5,678 im Kopf auszurechnen. Die Berechnung von 1,234 * 5,678 * 0 ist dagegen einfach. Man muss die Multiplikation der ersten beiden Faktoren nicht ausführen, um zum korrekten Ergebnis zu kommen. Dennoch ist auch das letztere immer noch eine Multiplikation.

Genauso sind boolesche Operatoren immer noch boolesche Operatoren, wenn man bei der Berechnung nur den Teil ausführt, der nötig ist, um zum korrekten Ergebnis zu kommen.

Hefee
Geschrieben von Hefee am 1. Juni 2025 um 17:50

&& und || sind schon logische UND bzw. OR Ausdrücke. Der Computer kennt jedochdie Logiktabellen und kürzt halt ab, wenn möglich. Schauen wir uns nochmal die Logiktabelle an:

0 OR 0 = 0 0 AND 0 = 0 0 OR 1 = 1 0 AND 1 = 0 1 OR 0 = 1 1 AND 0 = 0 1 OR 1 = 1 1 AND 1 = 1

das können wir noch etwas kompakter schreiben mit x = 0 oder 1

0 OR x = x 0 AND x = 0 1 OR x = 1 1 AND x = x

Dann sehen wir das schon der erste Operand entscheiden kann was das gesamt Ergebnis ist. Bei OR ist es die 1 beim ersten Operand und 0 beim AND. Und genau dass machen wir uns hier auch zu Nutze.

Also wenn du befehl1 && befehl2 ausführst siehst du in der Logiktabelle, wenn der erste Teil schon FALSE ist, dann kann befehl2 was auch immer sein, der Gesammtausdruck wird immer FALSE sein. Deswegen nimmt er die Abkürzung und führt den zweiten Teil halt gar nicht mehr aus, wenn der erste FALSE ist. Wenn der erste TRUE ist, dann muss er den zweiten Teil ausführen, weil der ja dann entscheidet, ob das Ergebnis TRUE oder FALSE ist.

Bei OR (||) ist es genau umgekehrt. Wenn der erste befehl schon TRUE ist, dann ist das Gesammtergebnis TRUE und der Computer nimmt die Abkürzung und führt den zweiten Befehl nicht mehr aus. Wenn der derste Befehl aber FALSE ist, muss er den zweiten Teil ausführen.

Der Cumputer sieht ja nur: Oh ein logischer Ausdruck: Okay dann werte ich den aus. Wenn er das Ergebnis schon kennt kürzt er halt ab. Das dies als Seiteneffekt haben kann dass der zweite Operand gar nicht mehr ausgewertet wird ist halt schlicht Optimierung. Aber genau diese Optimierung können wir halt ausnutzen. Wenn wir halt einen zweiten Befehl nur ausführen wollen, der basierend auf dem Rückgabewerte des ersten bassiert.

befehl1 || echo "Befehl 1 ist fehlgeschlagen :(" ist halt nur die Kurzform von:

if [ befehl1 == FALSE ]; than echo "Befehl1 ist fehlgeschlagen :(" fi

und befehl1 && echo "Befehl1 war erfolgreich. Glückwunsch :)" ist die Kurzform von:

if [ befehl1 == TRUE ]; than echo "Befehl1 war erfolgreich. Glückwunsch :)" fi

( weiß gerade nicht ob das der korrekte BASH syntaxt ist)

Nicht vergessen die eigentliche verwendung von AND und OR ist eigentlich hier:

if [ $a < 5 && $b > 6 ]; than echo "erfüllt" fi

Da machst du dir ja auch keine Gedanken, ob $b > 6 überhaupt ausgewertet wird oder nicht. Du willst halt einfach nur wissen sind beide Bedingungen erfüllt, oder nicht. Auch hier wird $b > 6 nur ausgewertet, wenn es nötig ist.

Übrigends nehmen fast alle Programmiersprachen diese Abkürzung, deswegen kann es Performance Unterschiede geben, jenachdem ob du A && B oder B && A schreibst.

spriggins
Geschrieben von spriggins am 3. Juni 2025 um 15:24

"Die Ausgabe 1 ist nur möglich, wenn ein XOR-Operator zur Anwendung kommt, weil True XOR True = False ist"

Eher nicht. Das OR wird ausgewertet, bis die Aussage wahr ist, danach muss es nicht mehr ausgewertet werden. Macht bei man vielen Programmiersprachen so - manchmal auch nur optional.

Also:
befehl1 && befehl2

  • bricht ab, wenn befehl1 falsch ist (weil dann der ganze Ausdruck bereits falsch ist)
  • macht weiter mit befehl2, wenn befehl1 wahr ist und wertet diesen aus

befehl1 || befehl2

  • bricht ab, wenn befehl1 wahr ist (weil dann der ganze Ausdruck bereits wahr ist)
  • macht weiter mit befehl2, wenn befehl1 falsch ist

Ein XOR müsste auf jeden Fall beide Befehle auswerten, um den Wahrheitswert zu ermitteln und könnte ohne Klammerung auch nicht mehrfach hintereinander gesetzt werden, weil - anders als OR oder XOR nicht assoziativ:

(1 XOR 1) XOR 0 != 1 XOR (1 XOR 0)