So verwenden Sie Bash-If-Anweisungen (mit 4 Beispielen)
Veröffentlicht: 2023-05-08if
then
fi
Struktur zu erstellen. Fügen Sie elif
Schlüsselwörter für zusätzliche bedingte Ausdrücke oder das else
Schlüsselwort hinzu, um einen Catch-all-Codeabschnitt zu definieren, der ausgeführt wird, wenn keine vorherige bedingte Klausel ausgeführt wurde.Alle nicht-trivialen Bash-Skripte müssen Entscheidungen treffen. Die if-Anweisung von Bash lässt Ihr Linux-Skript Fragen stellen und je nach Antwort verschiedene Codeabschnitte ausführen. So funktionieren sie.
Was ist bedingte Ausführung?
In allen außer den trivialsten Bash-Skripten muss der Ausführungsfluss je nach Ergebnis einer Entscheidung einen anderen Pfad durch das Skript nehmen. Dies wird als bedingte Ausführung bezeichnet.
Eine Möglichkeit, zu entscheiden, welcher Ausführungszweig genommen werden soll, ist die Verwendung einer if
Anweisung. Sie können if
Anweisungen hören, die if then
-Anweisungen oder if then else
-Anweisungen bezeichnet werden. Es sind unterschiedliche Namen für dasselbe.
Die if
Anweisung sagt, wenn etwas wahr ist, dann tue dies . Aber wenn das Etwas falsch ist, tun Sie das stattdessen. Das „Etwas“ kann vieles sein, z. B. der Wert einer Variablen, das Vorhandensein einer Datei oder ob zwei Zeichenfolgen übereinstimmen.
Die bedingte Ausführung ist für jedes sinnvolle Skript von entscheidender Bedeutung. Ohne sie sind Sie sehr eingeschränkt in dem, was Sie mit Ihrem Skript erreichen können. Wenn es keine sinnvollen Entscheidungen treffen kann, werden Sie nicht in der Lage sein, reale Probleme zu nehmen und praktikable Lösungen zu finden.
Die if
Anweisung ist wahrscheinlich das am häufigsten verwendete Mittel, um eine bedingte Ausführung zu erreichen. So verwenden Sie es in Bash-Skripten.
VERWANDT: So überprüfen Sie, ob eine Datei in Linux-Bash-Skripten vorhanden ist
Ein einfaches Beispiel für eine If-Anweisung
Dies ist die kanonische Form der einfachsten if
Anweisung:
wenn [diese-bedingung-ist-wahr] Dann Führe-diese-Anweisungen aus fi
Wenn die Bedingung im Text wahr wird, werden die Skriptzeilen in der then
Klausel ausgeführt. Wenn Sie Skripte durchsehen, die von anderen geschrieben wurden, sehen Sie möglicherweise die if
Anweisung in folgender Form:
wenn [diese-bedingung-ist-wahr]; Dann Führe-diese-Anweisungen aus fi
Einige Punkte zu beachten:
- Die
if
Anweisung wird abgeschlossen, indemfi
geschrieben wird. - Nach der ersten Klammer ”
[
” und vor der zweiten Klammer ”]
” des Bedingungstests muss ein Leerzeichen stehen. - Wenn Sie das Schlüsselwort
then
in dieselbe Zeile wie den Bedingungstest setzen, stellen Sie sicher, dass Sie ein Semikolon verwenden ”;
" nach dem Test.
Wir können eine optionale else
Klausel hinzufügen, um Code auszuführen, wenn sich der Bedingungstest als falsch erweist. Die else
Klausel benötigt kein then
Schlüsselwort.
wenn [diese-bedingung-ist-wahr] Dann Führe-diese-Anweisungen aus anders führe stattdessen diese Anweisungen aus fi
Dieses Skript zeigt ein einfaches Beispiel einer if
Anweisung, die eine else
Klausel verwendet. Der Bedingungstest prüft, ob das Alter des Kunden größer oder gleich 21 ist. Ist dies der Fall, kann der Kunde das Gelände betreten, und die then
-Klausel wird ausgeführt. Wenn sie nicht alt genug sind, wird die else
Klausel ausgeführt und sie dürfen nicht hinein.
#!/bin/bash Kundenalter=25 wenn [ $Kunden_Alter -ge 21 ] Dann echo "Komm rein." anders Echo "Du kannst nicht reinkommen." fi
Kopieren Sie das obige Skript in einen Editor, speichern Sie es als Datei namens „if-age.sh“ und machen Sie es mit dem Befehl chmod
ausführbar. Sie müssen dies mit jedem der Skripte tun, die wir besprechen.
chmod +x if-age.sh
Lassen Sie uns unser Skript ausführen.
./if-age.sh
Jetzt bearbeiten wir die Datei und verwenden ein Alter unter 21.
Kundenalter=18
Nehmen Sie diese Änderung an Ihrem Skript vor und speichern Sie Ihre Änderungen. Wenn wir es jetzt ausführen, gibt die Bedingung false zurück und die else-Klausel wird ausgeführt.
./if-age.sh
Die elif-Klausel
Die elif
Klausel fügt zusätzliche bedingte Tests hinzu. Sie können so viele elif
Klauseln haben, wie Sie möchten. Sie werden der Reihe nach ausgewertet, bis sich herausstellt, dass einer von ihnen wahr ist. Wenn sich keiner der elif
Bedingungstests als wahr erweist, wird die else
Klausel, falls vorhanden, ausgeführt.
Dieses Skript fragt nach einer Zahl und sagt Ihnen dann, ob sie ungerade oder gerade ist. Null ist eine gerade Zahl, also müssen wir nichts testen.
Alle anderen Zahlen werden getestet, indem der Modulo einer Division durch zwei ermittelt wird. In unserem Fall ist das Modulo der Bruchteil des Ergebnisses einer Division durch zwei. Wenn es keinen Bruchteil gibt, ist die Zahl genau durch zwei teilbar. Daher ist es eine gerade Zahl.
#!/bin/bash echo -n "Geben Sie eine Zahl ein: " Nummer lesen if [ $zahl -eq 0 ] Dann echo "Sie haben Null eingegeben. Null ist eine gerade Zahl." elif [ $(($number % 2)) -eq 0 ] Dann echo "Sie haben $Zahl eingegeben. Es ist eine gerade Zahl." anders echo "Sie haben $Zahl eingegeben. Es ist eine ungerade Zahl." fi
Um dieses Skript auszuführen, kopieren Sie es in einen Editor und speichern Sie es als "if-even.sh". Verwenden Sie dann chmod, um es ausführbar zu machen.
Lassen Sie uns das Skript ein paar Mal ausführen und seine Ausgabe überprüfen.
./if-even.sh
Das funktioniert alles bestens.
Verschiedene Formen des Bedingungstests
Die eckigen Klammern „ []
“, die wir für unsere bedingten Tests verwendet haben, sind eine Abkürzung für den Aufruf des test
. Aus diesem Grund stehen alle Vergleiche und Tests, die test
unterstützt, für Ihre if
Anweisung zur Verfügung.
Dies sind nur einige davon:
- ! expression : True, wenn der Ausdruck falsch ist.
- -n Zeichenfolge : Wahr, wenn die Länge der Zeichenfolge größer als Null ist.
- -z Zeichenfolge : Wahr, wenn die Länge der Zeichenfolge Null ist. Das heißt, es ist eine leere Zeichenfolge.
- string1 = string2 : Wahr, wenn string1 mit string2 identisch ist.
- string1 != string2 : True, wenn string1 nicht gleich string2 ist.
- integer1 -eq integer2 : True, wenn integer1 numerisch gleich integer2 ist
- integer1 -qt integer2 : True, wenn integer1 numerisch größer als integer2 ist
- integer1 -lt integer2 : True, wenn integer1 numerisch kleiner als integer2 ist
- -d Verzeichnis : Wahr, wenn das Verzeichnis existiert.
- -e Datei : True, wenn die Datei existiert.
- -s file : True, wenn die Datei mit einer Größe von mehr als Null existiert.
- -r file : True, wenn die Datei existiert und die Leseberechtigung gesetzt ist.
- -w file : True, wenn die Datei existiert und die Schreibberechtigung gesetzt ist.
- -x Datei : Wahr, wenn die Datei existiert und die Ausführungsberechtigung gesetzt ist.
In der Tabelle können „Datei“ und „Verzeichnis“ Verzeichnispfade enthalten, entweder relative oder absolute.
Das Gleichheitszeichen „ =
“ und der Gleichheitstest -eq
sind nicht identisch. Das Gleichheitszeichen führt einen zeichenweisen Textvergleich durch. Der Gleichheitstest führt einen numerischen Vergleich durch.
Wir können dies sehen, indem wir das test
auf der Befehlszeile verwenden.
test "diese Zeichenfolge" = "diese Zeichenfolge"
test "diese Zeichenfolge" = "diese Zeichenfolge"
Test 1 = 001
test 1 -eq 001
In jedem Fall verwenden wir den echo
Befehl, um den Rückgabecode des letzten Befehls auszugeben. Null bedeutet wahr, Eins bedeutet falsch.
Die Verwendung des Gleichheitszeichens „ =
“ gibt uns eine falsche Antwort, wenn wir 1 mit 001 vergleichen. Das ist richtig, weil es sich um zwei verschiedene Zeichenfolgen handelt. Numerisch haben sie denselben Wert – eins –, sodass der Operator -eq
eine wahre Antwort zurückgibt.
Wenn Sie Wildcard-Matching in Ihrem bedingten Test verwenden möchten, verwenden Sie die Syntax mit doppelten Klammern „ [[ ]]
“.
#!/bin/bash wenn [[ $USER == *ve ]] Dann echo "Hallo $USER" anders echo "$USER endet nicht auf 've'" fi
Dieses Skript überprüft den Kontonamen des aktuellen Benutzers. Wenn es auf „ ve
“ endet, gibt es den Benutzernamen aus. Wenn es nicht auf „ ve
“ endet, teilt Ihnen das Skript dies mit und endet.
./if-wild.sh
RELATED: Conditional Testing in Bash: if, then, else, elif
Verschachtelte If-Anweisungen
Sie können eine if
Anweisung in eine andere if
Anweisung einfügen.
Das ist vollkommen akzeptabel, aber das Verschachteln if
Anweisungen führt zu Code, der weniger leicht zu lesen und schwieriger zu warten ist. Wenn Sie feststellen, dass Sie mehr als zwei oder drei Ebenen von if
Anweisungen verschachteln, müssen Sie wahrscheinlich die Logik Ihres Skripts neu organisieren.
Hier ist ein Skript, das den Tag als Zahl von eins bis sieben erhält. Eins ist Montag, sieben ist Sonntag.
Es teilt uns die Öffnungszeiten eines Ladens mit. Wenn es ein Wochentag oder Samstag ist, meldet es, dass das Geschäft geöffnet ist. Wenn es ein Sonntag ist, meldet es, dass der Laden geschlossen ist.
Wenn der Laden geöffnet ist, führt die verschachtelte if
Anweisung einen zweiten Test durch. Wenn der Tag Mittwoch ist, sagt es uns, dass es nur morgens geöffnet ist.
#!/bin/bash # den Tag als Zahl 1..7 erhalten Tag=$(Datum +"%u") if [ $day -le 6 ] Dann ## Der Laden ist geöffnet if [ $day -eq 3 ] Dann # Mittwoch ist ein halber Tag echo "Mittwochs öffnen wir nur vormittags." anders # normale Wochentage und Samstag Echo "Wir haben den ganzen Tag geöffnet." fi anders # sonntags nicht geöffnet Echo "Es ist Sonntag, wir haben geschlossen." fi
Kopieren Sie dieses Skript in einen Editor, speichern Sie es als Datei namens „if-shop.sh“ und machen Sie es mit dem Befehl chmod
ausführbar.
Wir haben das Skript einmal ausgeführt und dann die Uhr des Computers auf Mittwoch geändert und das Skript erneut ausgeführt. Wir änderten dann den Tag auf einen Sonntag und liefen es noch einmal.
./if-shop.sh
./if-shop.sh
./if-shop.sh
VERWANDT: So verwenden Sie bedingte Tests mit doppelten Klammern in Linux
Der Fall Für wenn
Die bedingte Ausführung macht Programmieren und Skripten leistungsfähiger, und die bescheidene if
Anweisung ist möglicherweise die am häufigsten verwendete Methode, um den Ausführungspfad innerhalb von Code zu ändern. Aber das bedeutet nicht, dass es immer die Antwort ist.
Guten Code zu schreiben bedeutet, zu wissen, welche Möglichkeiten man hat und welche man am besten nutzt, um eine bestimmte Anforderung zu lösen. Die if
Anweisung ist großartig, aber lassen Sie sie nicht das einzige Werkzeug in Ihrer Tasche sein. Sehen Sie sich insbesondere die case
Anweisung an, die in einigen Szenarien eine Lösung sein kann.
VERWANDT: Verwendung von Case-Anweisungen in Bash-Skripten