Dies ist ein Fortsetzungsartikel in der Bash-Schleife, in dem wir im vorherigen Artikel die for-Schleife erläutert haben . In diesem Artikel werfen wir einen Blick auf zwei weitere Bash-Schleifen, nämlich while
und until
Schleife.
Das while
Schleife wird meistens verwendet, wenn Sie den Inhalt der Datei lesen und weiterverarbeiten müssen. Das Lesen und Schreiben in eine Datei sind gängige Vorgänge beim Schreiben von Bash-Skripten. Wir werden sehen, wie man Dateien mit while
liest Schleife.
Wir haben bereits einen sehr detaillierten Artikel darüber, wie man mit Umleitungsoperatoren in eine Datei schreibt.
- Bash-Umleitung mit Beispielen erklärt
Die Funktionalität von while
Schleife ähnelt for
Schleife. Der for
Schleife iteriert über eine Liste von Elementen und führt den Codeblock N mehrmals aus. Hier im while
Schleife wird die Bedingung zuerst ausgewertet, und wenn die Bedingung wahr ist, wird der Codeblock ausgeführt, bis die Bedingung als falsch ausgewertet wird.
1. While-Schleife
Unten ist das while
Schleifensyntax. Die Schleife beginnt mit dem "while" Schlüsselwort, gefolgt von einer Bedingung, die als wahr ausgewertet werden sollte. Zwischen do
und done
Im Block werden Ihre Codes platziert, die N-mal wiederholt werden.
while [[ condition ]] do Command 1 Command 2 .... Command 3 done
BEISPIEL 1 - Evaluieren und iterieren
Schauen Sie sich das folgende Beispiel an. Hier habe ich eine Variable "NUM=5"
erstellt und meine Bedingung ($NUM -ne 0
) ist, wird die Schleife ausgeführt, wenn die Variable NUM
ist ungleich Null.
$ NUM=5 while [[ $NUM -ne 0 ]] do printf "Value of NUM = $NUM \n" ((--NUM)) done
Sie sollten Zähler verwenden um in Variablen gespeicherte Werte zu erhöhen oder zu verringern, wenn mit while
gearbeitet wird Schleifen. Wenn nicht, wird es zu einer Endlosschleife und NUM
wird immer auf fünf gesetzt. Hier dekrementiere ich den Wert von NUM
in jeder Iteration durch Ausführen von ((--NUM))
, also wenn meine Variable NUM
auf Null gesetzt wird, endet die Schleife.
((++NUM)) → Increment NUM variable by 1, similar to running NUM=$(( $NUM + 1 )) ((--NUM)) → Decrement NUM variable by 1, similar to running NUM=$(( $NUM - 1 ))
BEISPIEL 2 - Endlosschleifen
Bei einer Endlosschleife wird Ihre Bedingung immer als wahr ausgewertet und die Schleife wird nie beendet.
Um Endlosschleifen zu erstellen, können Sie das in Bash eingebaute true
verwenden Stichwort. Verwenden Sie auch den "sleep"
Befehl beim Testen von Endlosschleifen, der Ihnen die Kontrolle über das Stoppen des Skripts gibt, sonst wird Ihr Bildschirm mit schnell scrollenden Ausgaben überflutet.
$ NUM=0 while true do printf "Value of NUM = $NUM \n" ((++NUM)) sleep 2 done
BEISPIEL 3 - Internes Feldtrennzeichen (IFS)
IFS ist eine spezielle Shell-Variable, die entscheidet, wie Ihre Wortgrenzen behandelt werden. Standardmäßig ist IFS auf Leerzeichen, Tabulator und ein Zeilenumbruchzeichen eingestellt. Öffnen Sie das Terminal und führen Sie die folgenden Befehle aus:
$ var1="foo:bar foo bar"
$ for val in $var1 do echo $val done
Sehen Sie sich die Ausgabe an. Der for
Schleife iteriert über eine Zeichenfolge und es ist IFS, das die Wortgrenzen bestimmt und Leerzeichen als Feldtrennzeichen betrachtet.
Führen Sie nun den folgenden Code erneut aus. Hier wird IFS auf den Doppelpunkt gesetzt .
$ var1="foo:bar foo bar"
$ IFS=":"
$ for val in $var1 do echo $val done
Aus der obigen Ausgabe können Sie ersehen, dass der benutzerdefinierte Feldtrenner Doppelpunkt als Wortgrenze verwendet wird. Sie können das IFS auf den Standardzustand zurücksetzen, indem Sie unset
ausführen Befehl.
$ unset IFS
BEISPIEL 4 - Datei mit While-Schleife lesen
Das while
Schleife empfiehlt sich, wenn Sie eine Datei zeilenweise lesen und verarbeiten möchten.
Erstellen Sie eine neue Datei namens test.txt
unter Verwendung der folgenden Inhalte. Es gibt eine leere Zeile nach Zeile 2, um das Verhalten zu zeigen, wie leere Zeilen gehandhabt werden.
14:00 Brighton v Leicester 14:00 West Ham v Man Utd 16:30 Spurs v Chelsea
Wir werden den read
verwenden Befehl, der Eingaben von der Umleitung akzeptiert und zusammen mit einem Eingabeumleitungsoperator in einer Variablen speichert, wobei der Dateiname an while
umgeleitet wird Schleife. Der read
Der Befehl verwendet das Standard-IFS, um die Wortteilungsgrenze festzulegen.
$ while read line do echo $line done < test.txt
Im obigen Beispiel test.txt
Datei wird zum while
umgeleitet Schleife und read
Der Befehl liest Zeile für Zeile und speichert sie in der Variablen "line" und es wird innerhalb der Schleife weiter verarbeitet. Leere Zeilen werden nicht übersprungen, wenn Sie dieser Methode folgen, und dies ist nicht das gewünschte Verhalten. Sie müssen also explizit Leerzeilen überspringen lassen.
Es gibt mehrere Optionen, um leere Zeilen aus der Eingabedatei herauszuschneiden. Sie können sed
verwenden , awk
, und bedingte Anweisungen usw. Ich bevorzuge die Verwendung von awk
und sed
um die leeren Zeilen zu bereinigen, bevor sie mit einem while
geloopt werden Schleife.
# USING SED $ sed -i '/^[[:space:]]*$/d' test.txt 14:00 Brighton v Leicester 14:00 West Ham v Man Utd 16:30 Spurs v Chelsea
# USING AWK $ awk 'NF' test.txt
Wie in den vorherigen Beispielen gezeigt, können Sie IFS ändern, je nachdem, wie Sie Ihre Datei lesen möchten. Wenn Sie beispielsweise eine CSV-Datei bearbeiten, kann das Trennzeichen auf ein Komma gesetzt werden. Ich habe dieselbe Eingabedatei so geändert, dass sie im CSV-Format vorliegt.
14:00,Brighton,Leicester 14:00,West Ham,Man Utd 16:30,Spurs,Chelsea
Im folgenden Beispiel ist IFS auf Komma gesetzt (IFS=","
) und jedes Feld wird in einer separaten Variablen gespeichert (Zeit, Team1, Team2).
while IFS="," read time team1 team2 do echo "$team1 is playing against $team2 at $time" done < test.txt
BEISPIEL 5 – Schleifenablaufsteuerung mit Break and Continue
Wenn Sie unseren Artikel über bash for loop gelesen haben, wissen Sie vielleicht, was break ist und fortfahren benutzt für. Sowohl break als auch Continue sind in Bash eingebaute Schlüsselwörter, die Ihnen helfen, den Fluss Ihrer Schleife zu steuern.
Das Schlüsselwort „break“ beendet die Schleife vollständig und übergibt die Steuerung an den nächsten Befehl im Skript. Im folgenden Beispiel. Wenn die NUM
gleich drei ist, wird die Schleife durch break
verlassen Befehl.
$ NUM=5 while [[ $NUM -ne 0 ]] do printf "Value of NUM = $NUM \n" if [[ $NUM -eq 3 ]] then break fi ((--NUM)) done
Das Schlüsselwort "Continue" überspringt die aktuelle Iteration und gibt die Kontrolle an die While-Schleife zurück und startet die nächste Iteration.
$ NUM=0 while [[ $NUM -lt 5 ]] do ((++NUM)) if [[ $NUM -eq 3 ]] then continue fi printf "Value of NUM = $NUM \n" done
2. Bis Schleife
Der until
Schleife ist das genaue Gegenteil von while
Schleife. Das while
Schleife wertet die Bedingung als wahr aus, um den Codeblock und den until
auszuführen loop wertet die Bedingung als falsch aus, damit die Schleife ausgeführt wird.
Die Syntax ist die gleiche wie bei while
Schleife, sondern anstelle des Schlüsselworts while
, until
verwendet werden.
until [[ condition ]] do Command 1 Command 2 .... Command 3 done
Im folgenden Beispiel sehen Sie until
Schleife wertet die Variable NUM
aus größer als gleich fünf sein. Es ist seit NUM
falsch auf Null gesetzt und wird in nachfolgenden Iterationen mit ((++NUM))
erhöht . Wenn also NUM
gleich fünf ist, wird die Bedingung als wahr ausgewertet und until
Schleife stoppt die Ausführung.
$ NUM=0
$ until [[ $NUM -ge 5 ]] do echo $NUM ((++NUM)) done
Um Endlosschleifen zu erstellen, können Sie das Schlüsselwort "false" verwenden .
$ NUM=0
$ until false do echo $NUM ((++NUM)) done
Um den Schleifenfluss zu steuern, können Sie den break
verwenden und continue
Schlüsselwörter wie in while
gezeigt Schleifenabschnitt oben.
Schlussfolgerung
In diesem Artikel haben wir gesehen, wie man while
verwendet loop und until
Schleife in Bash-Skripten. Until
Schleife wird im Vergleich zu for
am seltensten verwendet und while
Schleifen, aber das ist, um über Ihr Skript zu entscheiden und welche Arten von Schleifen erforderlich sind. Fühlen Sie sich wohl in der Verwendung aller drei Schleifen.
Wenn Sie Fragen oder Feedback haben, können Sie uns dies gerne über den Kommentarbereich unten mitteilen.
Verwandte Lektüre:
- Bash-Scripting – Funktionen mit Beispielen erklärt
- Bash-Scripting – Variablen mit Beispielen erklärt
- Bash-Echo-Befehl mit Beispielen in Linux erklärt
- Bash Heredoc-Tutorial für Anfänger
- Wie man einen Befehl unter Linux wiederholt, bis er erfolgreich ist
- Unterschied zwischen der Definition von Bash-Variablen mit und ohne Export