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