9 Beispiele für for-Schleifen in Linux-Bash-Skripten
Veröffentlicht: 2022-08-19 Die vielseitige Bash- for
-Schleife kann viel mehr als nur eine bestimmte Anzahl von Schleifen durchlaufen. Wir beschreiben seine vielen Varianten, damit Sie sie erfolgreich in Ihren eigenen Linux-Skripten verwenden können.
Die for-Schleife
Alle Skript- und Programmiersprachen haben eine Möglichkeit, mit Schleifen umzugehen. Eine Schleife ist ein Codeabschnitt, der wiederholt ausgeführt werden soll. Anstatt immer wieder dieselben Anweisungen in Ihr Skript einzugeben, wiederholt eine Schleife einen Codeabschnitt immer und 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 gibt vor, womit die Schleife arbeitet – zum Beispiel Zahlen oder Zeichenketten – und was die Endbedingung ist, die die Schleife stoppt.
Der Körper der Schleife enthält den Code, den Sie wiederholen möchten. Es enthält, 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 schrittweise zu durchlaufen. Für jede Schleife nimmt der Iterator den Wert der nächsten Zahl, Zeichenfolge oder des Datentyps an, über den die Schleife iteriert. Dadurch kann die Schleife der Reihe nach mit den Werten der einzelnen Datenelemente arbeiten oder in einigen Fällen sogar die Datenelemente selbst manipulieren.
Einfach für Schleifen
Wenn Sie Ihre erste for-Schleife schreiben möchten, werden Ihnen diese einfachen Beispiele den Einstieg erleichtern.
für Schleifen mit numerischen Listen
Sie können eine for
-Schleife auf der Befehlszeile ausführen. Dieser Befehl erstellt und führt eine einfache for
-Schleife aus. Der Iterator ist eine Variable namens i
. Wir werden i
der Reihe nach jedem der Werte in der Liste der Zahlen zuweisen. Der Körper der Schleife gibt diesen Wert im Terminalfenster aus. Die Bedingung, die diese Schleife beendet, ist, wenn i
über die gesamte Zahlenliste iteriert hat.
für i in 1 2 3 4 5; do echo $i; erledigt
Es ist wichtig zu beachten, dass die Variable i
jedes Mal um eins erhöht wird, wenn sich die Schleife dreht, aber das liegt daran, dass die Liste der Zahlen jedes Mal um eins erhöht wird.
Diese Zahlenliste beginnt bei 3 und geht in Zweierschritten nach oben, springt dann willkürlich bis 44.
für i in 3 5 7 9 11 44; do echo $i; erledigt
Es macht keinen Unterschied zur for
-Schleife. Es beginnt an einem Ende der Liste und verwendet nacheinander jeden Wert, bis alle Werte in der Liste verwendet wurden.
Die Nummern müssen auch nicht aufsteigend sein. Sie können in beliebiger Reihenfolge sein.
für i in 3 43 44 11 9; do echo $i; erledigt
für Schleifen mit Wortlisten
Genauso können wir das auch mit Worten tun. Kopieren Sie den Text des Skripts in einen Editor und speichern Sie ihn als „word-list.sh“.
#!/bin/bash for word in Dies ist eine Folge von Wörtern tun echo $wort erledigt
Sie müssen chmod
verwenden, um das Skript ausführbar zu machen, sowie jedes andere Skript, das Sie aus diesem Artikel kopieren. Ersetzen Sie einfach den Namen des Skripts jedes Mal, wenn Sie den Befehl chmod
verwenden.
chmod +x Wortliste.sh
Lassen Sie uns das Skript ausführen.
./Wortliste.sh
Genau wie bei den Zahlen arbeitet sich der Iterator – in diesem Beispiel die Variable word
– durch die Liste der Datenelemente, bis er das Ende der Liste erreicht. Der Schleifenkörper greift auf den Wert in der word
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 lästige 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/bash für i in {1..10} tun echo "Schleife drehen:" $i erledigt
Der Zahlenbereich wird in geschweiften Klammern „ {}
“ mit zwei Punkten „ ..
“ definiert, die die Zahlen trennen, die den Bereich beginnen und beenden. Stellen Sie sicher, dass Sie keine Leerzeichen in die Bereichsdefinition aufnehmen.
So läuft es ab:
./Nummernbereich.sh
Sie können eine weitere Zahl einfügen, die die Schrittgröße definiert, die der Iterator verwenden soll, um die Zahlen im Bereich zu durchlaufen. Dieses Skript „number-range2.sh“ verwendet einen Bereich von 0 bis 32 und eine Schrittgröße von 4.
#!/bin/bash für i in {0..32..4} tun echo "Schleife drehen:" $i erledigt
Der Iterator durchläuft den Zahlenbereich in Vierersprüngen.
./Nummernkreis2.sh
für 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/bash für Datei in Wortliste.sh Nummernbereich.sh Nummernbereich2.sh Dateinamen.sh tun ls -lh "$Datei" erledigt
Es wäre ziemlich sinnlos, ein Skript zu haben, das nur das tut, was ls
kann, aber es demonstriert, wie man auf Dateinamen innerhalb des Schleifenkörpers zugreift.
./Dateinamen.sh
Ähnlich wie bei der Verwendung des Zahlenbereichs können wir ein Dateimuster im Schleifenkopf verwenden, um die Dateien anzugeben, die wir verarbeiten möchten. Dies erspart viel Tipparbeit und bedeutet, dass wir die Namen der Dateien nicht im Voraus wissen 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 anzeigt.
#!/bin/bash für Datei in *.sh tun ls -lh "$Datei" erledigt
Hier ist die Ausgabe.
./Dateinamen2.sh
für Schleifen mit Befehlszeilenparametern
Wir können etwas mehr Flexibilität hinzufügen, indem wir das Dateinamenmuster auf der Befehlszeile übergeben. Die Variable $*
repräsentiert alle Befehlszeilenparameter, die an das Skript übergeben werden.
Dies ist „Dateiname3.sh“.
#!/bin/bash für Datei in $* tun ls -lh "$Datei" erledigt
Wir fragen nach Dateinamen, die mit „n“ beginnen und eine SH-Erweiterung haben.
./filenames3.sh n*.sh
Wir können auch mehr als ein Muster gleichzeitig übergeben.
./filenames3.sh n*.sh .bashrc
Die Iterator file
nimmt den Wert jedes Befehlszeilenparameters an. Dateinamenmuster werden erweitert, und alle Dateinamen werden im Schleifenkörper verarbeitet.
VERWANDT: So arbeiten Sie mit Variablen in Bash
C-ähnlich für Loops
Bash unterstützt die klassische For-Schleife mit drei Begriffen, wie sie in der Programmiersprache C zu finden ist. Sie werden for-Schleifen mit drei Begriffen genannt, weil 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 am Anfang der Schleife auf 1 gesetzt und die Schleife läuft so lange, wie die Aussage „ i<=10
“ wahr ist. Sobald i
11 erreicht, stoppt die for
-Schleife. Der Iterator wird bei jeder Umdrehung der Schleife um eins erhöht.
#!/bin/bash für (( i=1; i<=10; i++ )) tun echo "Schleifennummer:" $i erledigt
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. Dies ist „c-like2.sh“.
#!/bin/bash für (( i=15; i>0; i-=3 )) tun echo "Schleifennummer:" $i erledigt
Wenn wir es ausführen, sollte es in Dreierschritten rückwärts springen.
./c-like2.sh
Unendlich für Schleifen
Sie können dieses Format der for
-Schleife auch verwenden, um eine Endlosschleife zu erstellen. Alles, was Sie tun müssen, ist, alle Elemente aus dem Loop-Header zu entfernen, wie hier. Dies ist „infinite.sh“.
#!/bin/bash zum (( ; ; )) tun echo "Drücke Strg+C um zu stoppen..." schlafen 1 erledigt
Sie müssen Strg + C drücken, um die Schleife zu stoppen.
./unendlich.sh
for-Schleifen mit Word-Arrays
Wir können leicht durch eine Reihe von Wörtern iterieren. Wir müssen den Namen des Arrays im Loop-Header angeben, und der Iterator durchläuft alle Einträge im Array. Dies ist „word-array.sh“.
#!/bin/bash Distributionen=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") für die Distribution in $distributions tun echo $distro erledigt
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 Befehl continue
. Der continue
-Befehl verwirft den aktuellen Durchlauf der Schleife. Es inkrementiert den Iterator und startet den nächsten Durchlauf 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/bash Distributionen=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") für die Distribution in $distributions tun if [[ "$distro" == "Arch" ]] ; dann fortsetzen fi echo $distro erledigt
„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, wobei continue
durch break
ersetzt wurde.
#!/bin/bash Distributionen=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") für die Distribution in $distributions tun if [[ "$distro" == "Arch" ]] ; dann Unterbrechung fi echo $distro erledigt
Wenn der Iterator „Arch“ enthält, bricht die for-Schleife jede weitere Verarbeitung ab.
./word-array3.sh
für 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 dem Schlüssel und dem Wert werden sie auch Datenwörterbücher genannt.
Wir können ein assoziatives Array mit einer for
-Schleife durchlaufen. Dieses Skript ist „assoziative.sh“. Es definiert ein assoziatives Array mit vier Einträgen, jeweils einen für „Hund“, „Katze“, „Rotkehlchen“ und „Mensch“. Das sind die Schlüssel. Die Werte sind die (Standard-)Anzahl von Beinen, die sie haben.
#!/bin/bash deklarieren -A Tiere=( [Hund]=Vierbeinig [Katze]=Vierbeinig [Rotkehlchen]=Zweibeinig [Mensch]=Zweibeinig ) für Beine in ${!animals[@]} tun if [ ${animals[$legs]} == "Zweibeinig" ]; dann echo ${beine} fi erledigt
Der Iterator heißt legs
. Beachten Sie, dass der Loop-Header ein „ !
" Ausrufezeichen. Dies fungiert nicht als logischer NOT-Operator, sondern ist Teil der assoziativen Array-Syntax. Es ist erforderlich, das Array zu durchsuchen.
Der Körper der Schleife führt einen String-Vergleichstest durch. Wenn der Wert des Array-Mitglieds „Zweibeinig“ ist, gibt es den Schlüsselwert im Terminalfenster aus. Wenn wir es ausführen, druckt das Skript die zweibeinigen Kreaturen.
./assoziativ.sh
Iteration über die Ausgabe von Befehlen
Wenn Sie einen Befehl oder eine Folge von Befehlen haben, die eine Liste von etwas erzeugen, z. B. Dateinamen, können Sie sie mit einer for
-Schleife durchlaufen. Sie müssen auf unerwartete Dateinamenerweiterungen achten, aber in einfachen Fällen ist es in Ordnung.
Dieses Skript ist „command.sh“. Es verwendet ls
und wc
, um eine sortierte Liste von Skriptdateinamen zusammen mit ihrer Zeilen-, Wort- und Byteanzahl bereitzustellen.
#!/bin/bash für i in $(ls *.sh | sort); tun echo $(wc $i) erledigt
Wenn wir es ausführen, erhalten wir die Statistiken für jede Datei, wobei die Dateien in alphabetischer Reihenfolge aufgelistet sind.
./command.sh
Das Dazzling for Loop
Die for
-Schleife ist ein vielseitiges und leicht verständliches Skriptwerkzeug. Aber so flexibel es auch ist, vergessen Sie nicht, dass andere Schleifen aus einem bestimmten Grund existieren. Lassen Sie sich nicht davon blenden, dass die for
-Schleife alles ist, was Sie jemals brauchen werden.
Die while
-Schleife beispielsweise ist für bestimmte Dinge viel besser geeignet als die for
-Schleife, etwa um Zeilen aus einer Datei zu lesen.
Gute Drehbücher zu schreiben bedeutet, das am besten geeignete Werkzeug für die jeweilige Aufgabe zu verwenden. Die for
-Schleife ist ein großartiges Werkzeug, das Sie in Ihrer Trickkiste haben sollten.