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- for
Schleife 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- for
Schleife 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 for
Schleife in der Befehlszeile ausführen. Dieser Befehl erstellt eine einfache for
Schleife und führt sie aus. Der Iterator ist eine Variable namens i
. Wir werden i
nacheinander jedem der Werte in der Zahlenliste zuweisen. Der Schleifenkörper gibt diesen Wert im Terminalfenster aus. Die Bedingung, die diese Schleife beendet, ist, wenn i
die gesamte Zahlenliste durchlaufen wurde.
for i in 1 2 3 4 5; do echo $i; done
Hierbei ist zu beachten, dass die Variable i
jedes 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
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
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 chmod
Befehl verwenden.
chmod +x word-list.sh
Lassen Sie uns das Skript ausführen.
./word-list.sh
Genau wie bei den Zahlen arbeitet word
sich 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 word
Variablen zu und so wird jedes Wort in der Liste verarbeitet.
für Schleifen mit Nummernkreisen
Wenn Sie möchten, dass eine for
Schleife 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
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
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 ls
kann, aber es zeigt, wie man auf Dateinamen im Schleifenkörper zugreift.
./filenames.sh
Ä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
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
Wir können auch mehr als ein Muster gleichzeitig übergeben.
./filenames3.sh n*.sh. bashrc
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 I
wird zu Beginn der Schleife auf 1 gesetzt und die Schleife läuft so lange, wie die Aussage „ i<=10
„wahr ist. Sobald i
11 erreicht ist, for
stoppt 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
Die C-ähnliche for
Schleife ermöglicht die einfache Erstellung von for
Schleifen 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
Unendliche for-Schleifen
Sie können dieses Schleifenformat auch verwenden, for
um 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
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
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 continue
Befehl. Der continue
Befehl 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
Der Break-Befehl
Der break
Befehl bricht aus der Schleife aus und verhindert eine weitere Verarbeitung.
Dies ist „word-array3.sh“. Es ist dasselbe wie im vorherigen Skript, wurde jedoch continue
durch 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
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
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 for
Schleife 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 ls
und 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
Die Dazzling for-Schleife
Die for
Schleife 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 for
Schleife alles ist, was Sie jemals brauchen werden.
Die while
Schleife ist beispielsweise für bestimmte Dinge viel besser geeignet als die for
Schleife, 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 for
Loop ist ein großartiges Werkzeug, das Sie in Ihrer Trickkiste haben sollten.
Schreibe einen Kommentar