GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Skripting – While- und Until-Schleife mit Beispielen erklärt

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

Linux
  1. Bash For Loop Guide und Beispiele

  2. Head- und Tail-Befehle in Linux mit Beispielen erklärt

  3. Beispiele für Bash-For- und While-Schleifen

  4. Bleiben Sie auf dem Laufenden – Beispiele für Bash-For-, While- und Until-Loops

  5. Verwendung von und in der Bash-While-Schleife

Bash-Scripting – Printf-Befehl mit Beispielen erklärt

Bash-Scripting – Assoziatives Array mit Beispielen erklärt

Bash-Scripting – Indiziertes Array mit Beispielen erklärt

Bash For-Schleifen mit Beispielen

Bash-Scripting Teil 2 – For- und While-Schleifen mit Beispielen

Bash-Skript für Schleife mit Beispielen erklärt