9 Beispiele für for-Schleifen in Linux-Bash-Skripten

9 Beispiele für for-Schleifen in Linux-Bash-Skripten

Die zentralen Thesen

  • Die Bash for-Schleife ist ein vielseitiges Tool, das mit Zahlen, Wörtern, Arrays, Befehlszeilenvariablen oder der Ausgabe anderer Befehle arbeiten kann.
  • Einfache for-Schleifen können mit numerischen Listen oder Wortlisten verwendet werden, sodass Sie für jeden Wert in der Liste einen Codeabschnitt wiederholen können.
  • Die for-Schleife kann auch mit Zahlenbereichen, Dateinamen, Befehlszeilenparametern, Wortarrays und assoziativen Arrays verwendet werden und bietet so Flexibilität bei Skriptaufgaben.

Die vielseitige Bash- forSchleife kann viel mehr als nur eine festgelegte Anzahl von Malen durchlaufen. Wir beschreiben die vielen Varianten, damit Sie sie erfolgreich in Ihren eigenen Linux-Skripten verwenden können.

Die for-Schleife

Alle Skript- und Programmiersprachen verfügen über eine Möglichkeit, Schleifen zu verarbeiten. Eine Schleife ist ein Codeabschnitt, den Sie wiederholt ausführen lassen möchten. Anstatt immer wieder dieselben Anweisungen in Ihr Skript einzugeben , wiederholt eine Schleife einen Codeabschnitt immer wieder für Sie.

Die Bash- forSchleife ist sehr flexibel. Es kann mit Zahlen, Wörtern, Arrays, Befehlszeilenvariablen oder der Ausgabe anderer Befehle arbeiten. Diese werden im Header der Schleife verwendet. Der Header bestimmt, womit die Schleife arbeitet – zum Beispiel Zahlen oder Zeichenfolgen – und welche Endbedingung lautet, die die Schleife stoppt.

Der Schleifenkörper enthält den Code, den Sie wiederholen möchten. Es enthält das, was die Schleife tun soll. Der Schleifenkörper kann jeden gültigen Skriptbefehl enthalten.

Eine Variable namens Schleifenzähler oder Iterator wird verwendet, um einen Wertebereich oder eine Liste von Datenelementen zu durchlaufen. Für jede Schleife übernimmt der Iterator den Wert der nächsten Zahl, Zeichenfolge oder des Datentyps, über den die Schleife iteriert. Dadurch kann die Schleife nacheinander mit den Werten der einzelnen Datenelemente arbeiten oder in einigen Fällen sogar die Datenelemente selbst manipulieren.

Einfache for-Schleifen

Wenn Sie Ihre erste for-Schleife schreiben möchten, werden Ihnen diese einfachen Beispiele den Einstieg erleichtern.

for-Schleifen mit numerischen Listen

Sie können eine forSchleife in der Befehlszeile ausführen. Dieser Befehl erstellt eine einfache forSchleife und führt sie aus. Der Iterator ist eine Variable namens i. Wir werden inacheinander jedem der Werte in der Zahlenliste zuweisen. Der Schleifenkörper gibt diesen Wert im Terminalfenster aus. Die Bedingung, die diese Schleife beendet, ist, wenn idie gesamte Zahlenliste durchlaufen wurde.

for i in 1 2 3 4 5; do echo $i; done

a für Schleife, die von 1 bis 5 zählt

Hierbei ist zu beachten, dass die Variable ijedes Mal, wenn sich die Schleife dreht, um eins erhöht wird, aber das liegt daran, dass die Liste der Zahlen jedes Mal um eins erhöht wird.

Diese Zahlenliste beginnt bei 3 und steigt in Zweierschritten an, um dann willkürlich auf 44 zu springen.

for i in 3 5 7 9 11 44; do echo $i; done

eine for-Schleife, die eine nicht sequentielle Liste von Zahlen durchzählt

Für die Schleife macht es keinen Unterschied for. Es beginnt an einem Ende der Liste und verwendet nacheinander jeden Wert, bis alle Werte in der Liste verwendet wurden.

Die Zahlen müssen auch nicht in aufsteigender Reihenfolge vorliegen. Sie können in beliebiger Reihenfolge vorliegen.

for i in 3 43 44 11 9; do echo $i; done

eine for-Schleife, die eine unsortierte Liste von Zahlen durchzählt

for-Schleifen mit Wortlisten

Dasselbe können wir genauso gut mit Worten tun. Kopieren Sie den Text des Skripts in einen Editor und speichern Sie ihn als „word-list.sh“.

#!/bin/bashfor word in This is a sequence of wordsdo echo $worddone

Sie müssen verwenden chmod, um das Skript und jedes andere Skript, das Sie aus diesem Artikel kopieren, ausführbar zu machen. Ersetzen Sie einfach jedes Mal den Namen des Skripts, wenn Sie den chmodBefehl verwenden.

chmod +x word-list.sh

Mit chmod ein Skript ausführbar machen

Lassen Sie uns das Skript ausführen.

./word-list.sh

Eine for-Schleife, die eine Liste von Wörtern durcharbeitet

Genau wie bei den Zahlen arbeitet wordsich der Iterator – in diesem Beispiel die Variable – durch die Liste der Datenelemente, bis er das Ende der Liste erreicht. Der Schleifenkörper greift auf den Wert in der wordVariablen zu und so wird jedes Wort in der Liste verarbeitet.

für Schleifen mit Nummernkreisen

Wenn Sie möchten, dass eine forSchleife 100 Mal ausgeführt wird, wäre es eine ziemlich mühsame Angelegenheit, eine Folge von 100 Zahlen in den Schleifenkopf eingeben zu müssen. Bei Nummernkreisen können Sie nur die erste und letzte Nummer angeben.

Dieses Skript ist „number-range.sh“.

#!/bin/bashfor i in {1..10}do echo "Loop spin:" $idone

Der Zahlenbereich wird in geschweiften Klammern „ {}“ definiert, wobei zwei Punkte „ ..„die Zahlen trennen, die den Bereich beginnen und beenden. Stellen Sie sicher, dass Sie in der Bereichsdefinition keine Leerzeichen enthalten.

So läuft es:

./number-range.sh

Eine for-Schleife, die einen Zahlenbereich verwendet

Sie können eine weitere Zahl einfügen, die die Schrittgröße definiert, die der Iterator zum Durchlaufen der Zahlen im Bereich verwenden soll. Dieses Skript „number-range2.sh“ verwendet einen Bereich von 0 bis 32 und eine Schrittgröße von 4.

#!/bin/bashfor i in {0..32..4}do echo "Loop spin:" $idone

Der Iterator durchläuft den Zahlenbereich in Viererschritten.

./number-range2.sh

Eine for-Schleife mit einem Iteratorschritt von 4

for-Schleifen mit Dateinamen

Da wir Wortlisten verarbeiten können, können wir unsere Skripte dazu bringen, mit Dateinamen zu arbeiten. Dieses Skript heißt „filenames.sh“.

#!/bin/bashfor file in word-list.sh number-range.sh number-range2.sh filenames.shdo ls -lh "$file"done

Es wäre ziemlich sinnlos, ein Skript zu haben, das nur das tut, was es lskann, aber es zeigt, wie man auf Dateinamen im Schleifenkörper zugreift.

./filenames.sh

Eine for-Schleife, die eine Liste von Dateinamen verwendet

Ähnlich wie bei der Verwendung des Nummernkreises können wir ein Dateimuster im Schleifenkopf verwenden, um die Dateien anzugeben, die wir verarbeiten möchten. Dies erspart uns viel Tipparbeit und bedeutet, dass wir die Namen der Dateien nicht im Voraus kennen müssen.

Dieses Skript heißt „filenames2.sh“. Wir haben die Liste der Dateinamen durch das Dateinamenmuster „*.sh“ ersetzt, damit das Skript alle Skriptdateien im aktuellen Verzeichnis meldet.

#!/bin/bashfor file in *.shdo ls -lh "$file"done

Hier ist die Ausgabe.

./filenames2.sh

Eine for-Schleife mit dem Dateimuster *.sh

for-Schleifen mit Befehlszeilenparametern

Wir können etwas mehr Flexibilität hinzufügen, indem wir das Dateinamenmuster in der Befehlszeile übergeben. Die $*Variable stellt alle an das Skript übergebenen Befehlszeilenparameter dar.

Dies ist „filenames3.sh“.

#!/bin/bashfor file in $*do ls -lh "$file"done

Wir fragen nach Dateinamen, die mit „n“ beginnen und die Erweiterung SH haben.

./filenames3.sh n*.sh

Eine for-Schleife, die ein Dateimuster als Befehlszeilenparameter verwendet

Wir können auch mehr als ein Muster gleichzeitig übergeben.

./filenames3.sh n*.sh. bashrc

Eine for-Schleife, die ein Dateimuster und die Befehlszeilenparameter eines Dateinamens übernimmt

Die Iteratorvariable fileübernimmt den Wert jedes einzelnen Befehlszeilenparameters. Dateinamenmuster werden erweitert und alle Dateinamen werden im Schleifenkörper verarbeitet.

C-ähnliche for-Schleifen

Bash unterstützt die klassische Drei-Term-for-Schleife, wie sie beispielsweise in der Programmiersprache C zu finden ist. Sie werden Drei-Term-for-Schleifen genannt, da der Schleifenkopf drei Begriffe enthält.

  • Der Anfangswert des Schleifeniterators.
  • Der Test, ob die Schleife fortgesetzt oder beendet wird.
  • Das Inkrementieren – oder Dekrementieren – des Iterators.

Dieses Skript ist „c-like.sh“.

Der Iterator Iwird zu Beginn der Schleife auf 1 gesetzt und die Schleife läuft so lange, wie die Aussage „ i<=10„wahr ist. Sobald i11 erreicht ist, forstoppt die Schleife. Der Iterator wird bei jeder Umdrehung der Schleife um eins erhöht.

#!/bin/bashfor ((i=1; i<=10; i++))do echo "Loop number:" $idone

Lassen Sie uns dieses Skript ausführen.

./c-like.sh

Eine dreigliedrige oder C-ähnliche for-Schleife

Die C-ähnliche forSchleife ermöglicht die einfache Erstellung von forSchleifen mit etwas ungewöhnlichen Anforderungen. Diese Schleife beginnt bei 15 und zählt in 3er-Schritten rückwärts. Das ist „c-like2.sh“

#!/bin/bashfor ((i=15; i>0; i-=3))do echo "Loop number:" $idone

Wenn wir es ausführen, sollte es in Dreierschritten rückwärts springen.

./c-like2.sh

Eine C-ähnliche for-Schleife, die rückwärts zählt

Unendliche for-Schleifen

Sie können dieses Schleifenformat auch verwenden, forum eine Endlosschleife zu erstellen. Alles, was Sie tun müssen, ist, alle Elemente wie folgt aus dem Schleifenkopf zu entfernen. Das ist „infinite.sh“.

#!/bin/bashfor ((; ;))do echo "Press Ctrl+C to stop..." sleep 1done

Sie müssen Strg+C drücken, um die Schleife zu stoppen.

./infinite.sh

Eine unendliche C-ähnliche for-Schleife

for-Schleifen mit Wort-Arrays

Wir können problemlos eine Reihe von Wörtern durchlaufen. Wir müssen den Namen des Arrays im Schleifenheader angeben, und der Iterator durchläuft alle Einträge im Array. Dies ist „word-array.sh“.

#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo echo $distrodone

Alle Distributionen sind für uns aufgelistet.

./word-array.sh

Eine for-Schleife, die ein Wortarray verwendet

Der continue-Befehl

Wenn Sie möchten, dass die Schleife einen bestimmten Eintrag überspringt, testen Sie, ob der Iterator mit diesem Eintrag übereinstimmt, und verwenden Sie den continueBefehl. Der continueBefehl bricht die aktuelle Drehung der Schleife ab. Es erhöht den Iterator und startet die nächste Runde der Schleife – vorausgesetzt, der Eintrag, den Sie überspringen möchten, ist nicht das letzte Element in der Liste.

Dies ist „word-array2.sh“. Es überspringt den Array-Eintrag „Arch“, verarbeitet aber alle anderen Array-Mitglieder.

#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then continue fi echo $distrodone

„Arch“ erscheint nicht im Terminalfenster.

./word-array2.sh

Eine for-Schleife, die aufgrund des continue-Befehls einen Eintrag in einem Wortarray überspringt

Der Break-Befehl

Der breakBefehl bricht aus der Schleife aus und verhindert eine weitere Verarbeitung.

Dies ist „word-array3.sh“. Es ist dasselbe wie im vorherigen Skript, wurde jedoch continuedurch ersetzt break.

#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then break fi echo $distrodone

Wenn der Iterator „Arch“ enthält, bricht die for-Schleife jede weitere Verarbeitung ab.

./word-array3.sh


Eine for-Schleife, die aufgrund des Break-Befehls die weitere Verarbeitung abbricht

for-Schleifen mit assoziativen Arrays

In Bash 4 und höher können Sie mit assoziativen Arrays Listen von Schlüssel-Wert-Paaren erstellen, die nach Schlüssel oder Wert durchsucht werden können. Aufgrund der wechselseitigen Beziehung zwischen Schlüssel und Wert werden sie auch Datenwörterbücher genannt.

Wir können ein assoziatives Array mithilfe einer Schleife durchlaufen for. Dieses Skript heißt „associative.sh“. Es definiert ein assoziatives Array mit vier Einträgen darin, jeweils einen für „Hund“, „Katze“, „Rotkehlchen“ und „Mensch“. Dies sind die Schlüssel. Die Werte sind die (Standard-)Anzahl der Beine, die sie jeweils haben.

#!/bin/bashdeclare -A animals=([dog]=Four-legged [cat]=Four-legged [robin]=Two-legged [human]=Two-legged)for legs in ${!animals[@]}do if [ ${animals[$legs]} == "Two-legged" ]; then echo ${legs} fidone

Der Iterator heißt legs. Beachten Sie, dass der Schleifenkopf ein „ !“Ausrufezeichen enthält. Dies fungiert nicht als logischer NOT-Operator, sondern ist Teil der assoziativen Array-Syntax. Es ist erforderlich, das Array zu durchsuchen.

Der Schleifenkörper führt einen String-Vergleichstest durch. Wenn der Wert des Array-Mitglieds „Two-legged“ ist, wird der Schlüsselwert im Terminalfenster ausgegeben. Wenn wir es ausführen, gibt das Skript die zweibeinigen Kreaturen aus.

./associative.sh


Verwenden einer for-Schleife zum Extrahieren von Elementen aus einem assoziativen Array

Iterieren über die Ausgabe von Befehlen

Wenn Sie über einen Befehl oder eine Befehlsfolge verfügen, die eine Liste von Dingen wie Dateinamen erstellt, können Sie diese mit einer forSchleife durchlaufen. Sie müssen auf unerwartete Dateinamenerweiterungen achten, aber in einfachen Fällen ist das kein Problem.

Dieses Skript heißt „command.sh“. Es verwendet lsund wc, um eine sortierte Liste von Skriptdateinamen zusammen mit deren Zeilen-, Wort- und Byteanzahl bereitzustellen.

#!/bin/bashfor i in $(ls *.sh | sort);do echo $(wc $i)done

Wenn wir es ausführen, erhalten wir die Statistiken für jede Datei, wobei die Dateien in alphabetischer Reihenfolge aufgelistet sind.

./command.sh

Verwenden einer for-Schleife, um die Ausgabe von zwei Pipeline-Befehlen zu durchlaufen

Die Dazzling for-Schleife

Die forSchleife ist ein vielseitiges und leicht verständliches Skripttool. Aber so flexibel es auch ist, vergessen Sie nicht, dass andere Schleifen aus einem bestimmten Grund existieren. Lassen Sie sich nicht davon täuschen, dass die forSchleife alles ist, was Sie jemals brauchen werden.

Die whileSchleife ist beispielsweise für bestimmte Dinge viel besser geeignet als die forSchleife, etwa das Lesen von Zeilen aus einer Datei .

Gute Skripte zu schreiben bedeutet, das für die jeweilige Aufgabe am besten geeignete Werkzeug zu verwenden. Der forLoop ist ein großartiges Werkzeug, das Sie in Ihrer Trickkiste haben sollten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert