Schleife durch die Zeilen einer Datei: Bash For Loop Explained

Ich möchte mit einem Bash-Skript eine Schleife durch die Zeilen einer Datei laufen lassen, und eine der Möglichkeiten, dies zu tun, ist die Verwendung einer for-Schleife.

Was ist eine for-Schleife?

Eine for-Schleife ist eines der gebräuchlichsten Programmierkonstrukte und wird verwendet, um einen bestimmten Codeblock anhand einer Reihe von Elementen in einer Liste auszuführen. Nehmen wir zum Beispiel an, Sie möchten ein Programm schreiben, das die Anzahl der Einwohner der 10 größten europäischen Städte ausgibt. Das Programm kann eine for-Schleife verwenden, um durch jede Stadt in der Liste zu gehen und die Anzahl der Menschen für diese Stadt zu drucken.

Die Logik, die ausgeführt wird, ist jedes Mal die gleiche und das Einzige, was sich ändert, ist die Stadt.

Unten sehen Sie die allgemeine Syntax für eine Bash for-Schleife:

for item in do command1 command2 ... commandNdone

LISTE kann zum Beispiel sein:

  • ein Bereich von Zahlen.
  • eine Folge von Zeichenketten, die durch Leerzeichen getrennt sind.
  • die Ausgabe eines Linux-Befehls (z. B. des ls-Befehls).

Die N Befehle zwischen do und done werden für jedes Element in der Liste ausgeführt.

For-Schleife in der Bash

In diesem Artikel lernst du, wie man die for-Schleife in der Bash benutzt, und zwar um die Zeilen einer Datei durchzugehen.

Aber warum sollte man das tun? Die Zeilen einer Datei durchgehen?

Das kann zum Beispiel nötig sein, wenn man Daten aus einer Anwendung in eine Datei exportiert hat und diese Daten irgendwie aufbereiten will.

In diesem Beispiel verwenden wir eine einfache .txt-Datei, in der jede Zeile enthält:

  • den Namen einer Stadt
  • die Anzahl der Menschen, die in dieser Stadt leben.

Unten sehen Sie das Format der Textdatei, ein Doppelpunkt trennt jede Stadt von der Anzahl der Menschen, die in dieser Stadt leben:

Istanbul:15,067,724Moscow:12,615,279London:9,126,366... 

Wie können wir nun eine Bash for-Schleife verwenden, um den Inhalt dieser Datei zu durchsuchen?

Zunächst speichern wir den Namen der Datei in einer Variablen

FILENAME="european-cities.txt"

Danach verwenden wir eine weitere Variable und den cat-Befehl, um alle Zeilen in der Datei zu erhalten:

LINES=$(cat $FILENAME)

Hier verwenden wir Befehlssubstitution, um die Ausgabe des cat-Befehls den LINES-Variablen zuzuweisen.

Schließlich ermöglicht die for-Schleife, jede Zeile der Datei zu durchlaufen:

for LINE in $LINESdo echo "$LINE"done

Do und done werden verwendet, um die Befehle zu definieren, die bei jeder Iteration der for-Schleife ausgeführt werden.

Bei einer Datei mit 10 Zeilen durchläuft die for-Schleife beispielsweise 10 Iterationen und liest bei jeder Iteration eine Zeile der Datei.

Der echo-Befehl kann durch eine beliebige Folge von Befehlen ersetzt werden, je nachdem, was man mit den einzelnen Zeilen der Datei machen will.

Hier ist das endgültige Skript:

#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)for LINE in $LINESdo echo "$LINE"done

Und die Ausgabe des Skripts ist…

./cities.sh Istanbul:15,067,724Moscow:12,615,279London:9,126,366Saint-Petersburg:5,383,890Berlin:3,748,148Kyiv:3,703,100Madrid:3,223,334Rome:2,857,321Paris:2,140,526Bucharest:2,106,144

Wir übergeben die Liste an die for-Schleife, indem wir den cat-Befehl verwenden.

Das bedeutet, dass wir beliebige Befehle verwenden können, um die LISTE zu erzeugen, die an die for-Schleife übergeben werden soll.

Fallen Ihnen noch andere mögliche Befehle ein?

Außerdem ist die for-Schleife nicht die einzige Möglichkeit, eine Schleife in einem Bash-Skript zu erstellen, eine weitere Möglichkeit ist eine while-Schleife.

Was ist ein Zähler in einer for-Schleife der Bash?

In einer for-Schleife können Sie auch eine Variable namens counter definieren. Sie können einen Zähler verwenden, um jede Iteration der Schleife zu verfolgen.

Die Verwendung eines Zählers ist in allen Programmiersprachen sehr verbreitet. Er kann auch verwendet werden, um auf die Elemente einer Datenstruktur innerhalb der Schleife zuzugreifen (dies ist in unserem Beispiel nicht der Fall).

Lassen Sie uns das vorherige Programm ändern und einen Zähler definieren, dessen Wert bei jeder Iteration ausgegeben wird:

#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)COUNTER=0for LINE in $LINESdo echo "Counter $COUNTER: $LINE" COUNTER=$((COUNTER+1))done

Wie Sie sehen, habe ich eine Variable namens COUNTER außerhalb der for-Schleife definiert, deren Anfangswert auf 0 gesetzt ist.

Dann gebe ich bei jeder Iteration den Wert des Zählers zusammen mit der Zeile aus der Datei aus.

Nachdem ich das getan habe, verwende ich den arithmetischen Operator der Bash, um den Wert der Variablen COUNTER um 1 zu erhöhen.

Und hier ist die Ausgabe des Skripts:

Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366Counter 3: Saint-Petersburg:5,383,890Counter 4: Berlin:3,748,148Counter 5: Kyiv:3,703,100Counter 6: Madrid:3,223,334Counter 7: Rome:2,857,321Counter 8: Paris:2,140,526Counter 9: Bucharest:2,106,144

Break und Continue in einer Bash For-Schleife

Es gibt Möglichkeiten, den normalen Ablauf einer for-Schleife in der Bash zu verändern.

Die beiden Anweisungen, die das ermöglichen, sind break und continue:

  • break: unterbricht die Ausführung der for-Schleife und springt zur ersten Zeile nach der for-Schleife.
  • continue: springt zur nächsten Iteration der for-Schleife.

Da wir einen Zähler definiert haben, können wir sehen, was passiert, wenn wir break oder continue zu unserem bestehenden Skript hinzufügen.

Beginnen wir mit break…

Ich werde eine if-Anweisung basierend auf dem Wert des Zählers hinzufügen. Die break-Anweisung innerhalb der if-Anweisung unterbricht die Ausführung der Schleife, wenn der Zähler gleich 3 ist:

#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)COUNTER=0for LINE in $LINESdo if ; then break fi echo "Counter $COUNTER: $LINE" COUNTER=$((COUNTER+1))done

Und die Ausgabe lautet:

Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366

Wie Sie sehen können, stoppt die break-Anweisung die Ausführung der for-Schleife, bevor der echo-Befehl erreicht wird, weil der Zähler 3 ist.

Ersetzen wir break durch continue und sehen, was passiert. Ich werde den Rest des Codes unverändert lassen.

#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)COUNTER=0for LINE in $LINESdo if ; then continue fi echo "Counter $COUNTER: $LINE" COUNTER=$((COUNTER+1))done

Und hier ist die Ausgabe für das Skript:

Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366

Komisch…die Ausgabe ist die gleiche. Warum?

Das liegt daran, dass die continue-Anweisung, wenn der Wert des Zählers 3 ist, zur nächsten Iteration der Schleife springt, aber den Wert des Zählers nicht erhöht.

Bei der nächsten Iteration ist der Wert des Zählers also immer noch 3 und die continue-Anweisung wird erneut ausgeführt, und so weiter für alle anderen Iterationen.

Um dies zu beheben, müssen wir den Wert der Variable COUNTER innerhalb der if-Anweisung erhöhen:

#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)COUNTER=0for LINE in $LINESdo if ; then COUNTER=$((COUNTER+1)) continue fi echo "Counter $COUNTER: $LINE" COUNTER=$((COUNTER+1))done

Diesmal sehen wir die korrekte Ausgabe:

Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366Counter 4: Berlin:3,748,148Counter 5: Kyiv:3,703,100Counter 6: Madrid:3,223,334Counter 7: Rome:2,857,321Counter 8: Paris:2,140,526Counter 9: Bucharest:2,106,144

Wie Sie sehen können, wird „Counter 3: ….“ nicht im Terminal ausgegeben.

Schreiben einer For-Schleife in einer Zeile

Bevor wir dieses Tutorial beenden, sehen wir uns an, wie wir eine For-Schleife in einer Zeile schreiben können.

Dies ist keine empfohlene Praxis, da es deinen Code weniger lesbar macht.

Aber es ist gut zu wissen, wie man eine Schleife in einer Zeile schreibt, es gibt deinem Bash-Wissen mehr Tiefe.

Die allgemeine Syntax für eine einzeilige for-Schleife in der Bash lautet wie folgt:

for i in ; do ; done

Lassen Sie uns den Inhalt unserer Textdatei mit einer einzeiligen for-Schleife ausgeben:

#!/bin/bashFILENAME="european-cities.txt"LINES=$(cat $FILENAME)for LINE in $LINES; do echo $LINE; done

Zur Vereinfachung habe ich den COUNTER und die if-Anweisung entfernt. Wären sie vorhanden, wäre die einzeilige for-Schleife viel schwerer zu lesen.

Versuchen Sie, sich von Einzeilern fernzuhalten, wenn sie Ihren Code schwer lesbar machen.

Abschluss

Zusammenfassend haben Sie in diesem Tutorial gelernt, wie man:

  1. Die Zeilen einer Datei in einer Variablen speichert
  2. Eine for-Schleife verwendet, um durch jede Zeile zu gehen.
  3. Verwenden Sie einen Zähler in einer for-Schleife.
  4. Ändern Sie den Ablauf einer Schleife mit break und continue.
  5. Schreiben Sie eine for-Schleife in einer Zeile.

Macht das Sinn?

Wie werden Sie das verwenden?

Lassen Sie es mich wissen 🙂

Wenn Sie mehr über Schleifen in der Bash-Skripterstellung erfahren möchten, schauen Sie sich dieses Tutorial an.

Zugehöriger KOSTENLOSER Kurs: Bash Scripting entschlüsseln

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.