Mit den Operatoren &&, || und ! können Sie Tests durchführen und auf der Grundlage der Testergebnisse Aktionen ausführen, aber sie können etwas kompliziert sein, bis Sie die zugrunde liegende Logik verstehen. [...]
Mit den Operatoren &&, || und ! können Sie unter Linux viele nützliche Funktionen ausführen, aber Sie müssen sich zunächst an die Syntax gewöhnen, die ein wenig komplizierter ist als die der if-then-else-Befehle, die Sie normalerweise verwenden. Zu Beginn sollte ich erklären, dass eine Gemeinsamkeit der Befehlsbeispiele in diesem Beitrag die Verwendung von etwas ist, das ich als Kurztest „if“ bezeichnen würde.
Hier ist ein Beispiel:
$ [ -f donuts ]
$ echo %?
1
Der Befehl -f donuts fragt, ob es eine Datei (-f) namens „donuts“ gibt. Das Ergebnis des Tests wird nicht angezeigt, es sei denn, wir geben den Rückgabewert anschließend mit „echo $?“ aus. In diesem Fall ist es falsch (d.h. nicht Null), so dass wir wissen, dass die Datei nicht existiert. Keine Donuts für uns!
Um einen ähnlichen, aber entgegengesetzten Test zu erstellen, könnten wir fragen, ob keine Donuts-Datei existiert. Dieser Test würde wie folgt aussehen:
$ [ ! -f donuts ]
$ echo $?
0
Dieses Mal ist das Ergebnis wahr (0). Wieder keine Donuts. Allerdings werden diese Befehle im Allgemeinen nicht auf diese Weise verwendet. Stattdessen werden die Operatoren && oder || am Ende angehängt, um einen Befehl auf der Grundlage der Ergebnisse des durchgeführten Tests auszuführen. Wenn es zum Beispiel keine Datei namens donuts gibt, könnten Sie eine Beschwerde wie diese einreichen:
$ [ ! -f donuts ] && echo „Wir brauchen donuts!“
Der Schlüssel zum Verständnis dieses Befehls ist, dass && ein „UND“-Operator ist, während || ein „ODER“-Operator ist. Wenn Sie einen Befehl wie den oben gezeigten ausführen, werden beide Seiten des Befehls – der Test und der resultierende Befehl – ausgeführt, wenn es keine Datei namens „donuts“ gibt. Der Befehl besagt im Grunde, dass „wenn eine Datei namens donuts nicht existiert, der Text mit dem Befehl echo angezeigt wird“. Wenn das Ergebnis des Tests mit && wahr ist, wird der Befehl auf der rechten Seite des && ausgeführt. Wenn das Ergebnis falsch ist, wird der Befehl beendet.
Dieser Befehl sagt: „Wenn es ein Verzeichnis namens mydir gibt“, zeige eine Liste an:
$ [ -d mydir ] && ls -ld mydir
drwxr-xr-x. 2 shs shs 4096 Apr 13 11:46 mydir
In diesem nächsten Beispiel testen wir, ob ein Verzeichnis nicht existiert. Ist dies nicht der Fall, wird mit dem Befehl mkdir ein Verzeichnis erstellt. Der zweite Befehl, der unten gezeigt wird, prüft, ob das Verzeichnis erstellt wurde. Wenn das Verzeichnis bereits existiert, liefert der Befehl einen Fehlerstatus und der Befehl mkdir wird nicht ausgeführt.
$ [ ! -d newdir ] && mkdir newdir
$ ls -ld newdir
drwxr-xr-x. 2 shs shs 4096 Apr 11 11:54 newdir
Das Gegenteil ist der Fall, wenn Sie || verwenden. Wenn der erste Teil des Befehls erfolgreich ist (also „wahr“ ergibt), wird der zweite Teil nie ausgeführt.
Für &&-Operatoren ist die folgende Logik implementiert:
Wenn ERGEBNIS dann AKTION
Wenn ERFOLG dann AUSFÜHREN des zweiten Befehls
Wenn FAIL dann BEENDEN
Wenn Sie einen Befehl mit || ausführen, wird der zweite Teil des Befehls nur ausgeführt, wenn der erste fehlschlägt. Wenn der erste Teil erfolgreich ist, ist der Befehl beendet. Mit anderen Worten: Der Befehl ist erfüllt, wenn einer der beiden Teile funktioniert.
Für ||-Operatoren ist die folgende Logik implementiert:
Wenn ERGEBNIS dann AKTION
Wenn ERFOLG dann BEENDEN
Wenn FAIL dann AUSFÜHREN 2. Befehl
In diesem nächsten Beispiel wird geprüft, ob es ein Verzeichnis mit dem Namen „scripts“ gibt. Ist dies nicht der Fall (d.h. das Testergebnis ist „falsch“), wird der zweite Teil des Befehls ausgeführt und der Befehl mkdir erstellt das Verzeichnis. Wenn ein Verzeichnis scripts vorhanden ist, wird der Befehl beendet und der Befehl mkdir nicht ausgeführt.
$ [ -d scripts ] || mkdir scripts
$ ls -ld scripts
drwxr-xr-x. 2 shs shs 4096 Apr 11 12:16 scripts
Fazit
Obwohl && und || sich unterschiedlich verhalten, können Sie beide Operatoren verwenden, um das gleiche Ergebnis zu erzielen. Die folgenden Beispiele veranschaulichen dies.
Jeder der folgenden Befehle erstellt eine Datei mit dem Namen notes, wenn noch keine existiert, und tut nichts, wenn sie existiert.
$ [ ! -f notes ] && touch notes
$ [ -f notes ] || touch notes
In ähnlicher Weise erstellt jeder der beiden folgenden Befehle ein Verzeichnis mit dem Namen scripts, wenn es noch nicht existiert, und nimmt ansonsten keine Änderungen vor.
$ [ ! -d scripts ] && mkdir scripts
$ [ -d skripte ] || mkdir skripte
Die Verwendung von && und || mag zwar etwas kompliziert erscheinen, aber ein wenig Übung und einige praktische Beispielbefehle können sich wirklich auszahlen.
*Sandra Henry-Stocker verwaltet seit mehr als 30 Jahren Unix-Systeme. Sie bezeichnet sich selbst als „USL“ (Unix als Zweitsprache), kann aber genug Englisch, um Bücher zu schreiben und einzukaufen. Sie lebt in den Bergen von Virginia, wo sie, wenn sie nicht mit Unix arbeitet oder darüber schreibt, die Bären von ihren Vogelfutterstellen verjagt.
Be the first to comment