Es gibt zwei Arten von Bash für Schleifen. Einer verwendet das Schlüsselwort „in“ mit einer Liste von Werten, ein anderer verwendet die Syntax ähnlich der C-Programmierung.
Dieser Artikel ist Teil unserer fortlaufenden Bash-Tutorial-Reihe.
Dies erklärt beide Bash-for-Loop-Methoden und bietet 12 verschiedene Beispiele zur Verwendung der Bash-for-Schleife in Ihren Shell-Skripten.
Legen Sie für diesen Artikel ein Lesezeichen für die Zukunft, da dies der einzige Artikel für Sie ist jemals mit Beispielen auf die Verwendung von Bash-Schleifen verweisen müssten.
Methode 1:Bash-For-Schleife mit „in“ und Werteliste
Syntax:
for varname in list do command1 command2 .. done
In obiger Syntax:
- for, in, do und done sind Schlüsselwörter
- „Liste“ enthält eine Liste von Werten. Die Liste kann eine Variable sein, die mehrere durch Leerzeichen getrennte Wörter enthält. Wenn die Liste in der for-Anweisung fehlt, werden die Positionsparameter verwendet, die an die Shell übergeben wurden.
- varname ist ein beliebiger Bash-Variablenname.
In dieser Form führt die for-Anweisung die in einem Hauptteil eingeschlossenen Befehle einmal für jedes Element in der Liste aus. Wenn die Werteliste beispielsweise 5 Elemente enthält, wird die for-Schleife insgesamt 5 Mal ausgeführt, einmal für jedes Element in der Liste. Das aktuelle Element aus der Liste wird bei jedem Schleifendurchlauf in einer Variablen „varname“ gespeichert. Dieser „varname“ kann im Körper der for-Schleife verarbeitet werden.
Methode 2:Bash for Loop mit C-ähnlicher Syntax
Die zweite Form der for-Schleife ähnelt der for-Schleife in der Programmiersprache „C“, die drei Ausdrücke hat (Initialisierung, Bedingung und Aktualisierung).
for (( expr1; expr2; expr3 )) do command1 command2 .. done
In der obigen Bash für die Befehlssyntax
- Vor der ersten Iteration wird expr1 ausgewertet. Dies wird normalerweise verwendet, um Variablen für die Schleife zu initialisieren.
- Alle Anweisungen zwischen do und done werden wiederholt ausgeführt, bis der Wert von expr2 TRUE ist.
- Nach jeder Iteration der Schleife wird expr3 ausgewertet. Dies wird normalerweise verwendet, um einen Schleifenzähler zu inkrementieren.
Die folgenden 12 Beispiele zeigen, wie man For-Loops auf unterschiedliche Weise basht.
1. Statische Werte für die Liste nach dem Schlüsselwort „in“
Im folgenden Beispiel wird die Liste der Werte (Mo, Di, Mi, Do und Fr) direkt nach dem Schlüsselwort „in“ in der Bash-For-Schleife angegeben.
$ cat for1.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" done $ ./for1.sh Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
Achtung: Die Werteliste sollte nicht durch Komma getrennt werden (Mo, Di, Mi, Do, Fr). Das Komma wird als Teil des Werts behandelt. Anstelle von „Mon“ wird „Mon“ als Wert verwendet, wie im Beispiel unten gezeigt.
$ cat for1-wrong1.sh i=1 for day in Mon, Tue, Wed, Thu, Fri do echo "Weekday $((i++)) : $day" done $ ./for1-wrong1.sh Weekday 1 : Mon, Weekday 2 : Tue, Weekday 3 : Wed, Weekday 4 : Thu, Weekday 5 : Fri
Achtung: Die Werteliste sollte nicht in doppelte Anführungszeichen gesetzt werden. („Mo Di Mi Do Fr“). Wenn Sie es in doppelte Anführungszeichen setzen, wird es als ein einzelner Wert behandelt (anstelle von 5 verschiedenen Werten), wie im Beispiel unten gezeigt.
$ cat for1-wrong2.sh i=1 for day in "Mon Tue Wed Thu Fri" do echo "Weekday $((i++)) : $day" done $ ./for1-wrong2.sh Weekday 1 : Mon Tue Wed Thu Fri
2. Variable für die Liste nach dem Schlüsselwort „in“
Anstatt die Werte direkt in der for-Schleife bereitzustellen, können Sie die Werte in einer Variablen speichern und die Variable in der for-Schleife nach dem Schlüsselwort „in“ verwenden, wie im folgenden Beispiel gezeigt.
$ cat for2.sh i=1 weekdays="Mon Tue Wed Thu Fri" for day in $weekdays do echo "Weekday $((i++)) : $day" done $ ./for2.sh Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
Achtung :Als bewährte Methode sollten Sie die Bash-Variablen immer in Anführungszeichen setzen, wenn Sie darauf verweisen. Es gibt wenige Ausnahmen von dieser Best-Practice-Regel. Dies ist einer von ihnen. Wenn Sie die Variable in dieser for-Schleife in doppelte Anführungszeichen setzen, wird die Werteliste als einzelner Wert behandelt. Viele Menschen tappen in diese Falle. Seien Sie vorsichtig und setzen Sie Ihre Variable in der for-Schleife nicht in doppelte Anführungszeichen.
$ cat for2-wrong.sh i=1 weekdays="Mon Tue Wed Thu Fri" for day in "$weekdays" do echo "Weekday $((i++)) : $day" done $ ./for2-wrong.sh Weekday 1 : Mon Tue Wed Thu Fri
3. Geben Sie die Liste nicht an; erhalten Sie es aus den Positionsparametern
Wenn Sie das Schlüsselwort „in“ gefolgt von keiner Liste von Werten in der for-Schleife der Bash angeben, werden die Positionsparameter verwendet (d. h. die Argumente, die an das Shell-Skript übergeben werden).
$ cat for3.sh i=1 for day do echo "Weekday $((i++)) : $day" done $ ./for3.sh Mon Tue Wed Thu Fri Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
Achtung: Bitte seien Sie vorsichtig, wenn Sie diese Methode verwenden. Sie sollten das Schlüsselwort „in“ nicht in die for-Schleife einfügen. Wenn Sie das Schlüsselwort „in“ ohne Werte belassen, wird der Positionsparameter nicht verwendet, wie unten gezeigt. Es wird nicht in die Schleife gehen. d.h. die for-Schleife wird nie ausgeführt, wie im Beispiel unten gezeigt.
$ cat for3-wrong.sh i=1 for day in do echo "Weekday $((i++)) : $day" done $ ./for3-wrong.sh Mon Tue Wed Thu Fri
Hinweis :Lesen Sie unseren früheren Artikel, um mehr über Bash-Positionsparameter zu erfahren.
4. Unix-Befehlsausgabe als Listenwerte nach dem Schlüsselwort „in“
Sie können die Ausgabe eines beliebigen UNIX-/Linux-Befehls als Werteliste für die for-Schleife verwenden, indem Sie den Befehl wie unten gezeigt in Backticks ` ` einschließen.
$ cat for4.sh i=1 for username in `awk -F: '{print $1}' /etc/passwd` do echo "Username $((i++)) : $username" done $ ./for4.sh Username 1 : ramesh Username 2 : john Username 3 : preeti Username 4 : jason ..
5. Dateien und Verzeichnisse in einer for-Schleife durchlaufen
Um Dateien und Verzeichnisse unter einem bestimmten Verzeichnis zu durchlaufen, cd einfach in dieses Verzeichnis und gib * in der for-Schleife ein, wie unten gezeigt.
Das folgende Beispiel durchläuft alle Dateien und Verzeichnisse in Ihrem Home-Verzeichnis.
$ cat for5.sh i=1 cd ~ for item in * do echo "Item $((i++)) : $item" done $ ./for5.sh Item 1 : positional-parameters.sh Item 2 : backup.sh Item 3 : emp-report.awk Item 4 : item-list.sed Item 5 : employee.db Item 8 : storage Item 9 : downloads
Die Verwendung von * in der Bash-for-Schleife ähnelt dem Dateiglobbing, das wir in der Linux-Befehlszeile verwenden, wenn wir den Befehl ls (und andere Befehle) verwenden.
Im Folgenden werden beispielsweise alle Dateien und Verzeichnisse in Ihrem Home-Verzeichnis angezeigt. Dies ist das Konzept, das im obigen for5.sh-Beispiel verwendet wird.
cd ~ ls *
Im Folgenden werden alle *.conf-Dateien angezeigt, die entweder mit a, b oder c oder d im /etc-Verzeichnis beginnen.
$ ls -1 /etc/[abcd]*.conf /etc/asound.conf /etc/autofs_ldap_auth.conf /etc/cas.conf /etc/cgconfig.conf /etc/cgrules.conf /etc/dracut.conf
Dasselbe Argument, das im obigen ls-Befehl verwendet wird, kann in einer Bash-for-Schleife verwendet werden, wie im folgenden Beispiel gezeigt.
$ cat for5-1.sh i=1 for file in /etc/[abcd]*.conf do echo "File $((i++)) : $file" done $ ./for5-1.sh File 1 : /etc/asound.conf File 2 : /etc/autofs_ldap_auth.conf File 3 : /etc/cas.conf File 4 : /etc/cgconfig.conf File 5 : /etc/cgrules.conf File 6 : /etc/dracut.conf
6. Verlassen Sie die for-Schleife
Sie können eine for-Schleife mit dem Befehl „break“ wie unten gezeigt verlassen.
$ cat for6.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" if [ $i -eq 3 ]; then break; fi done $ ./for6.sh Weekday 1 : Mon Weekday 2 : Tue
7. Fahren Sie am Anfang der for-Schleife fort
Unter bestimmten Bedingungen können Sie den Rest der Befehle in der for-Schleife ignorieren und die Schleife erneut von Anfang an fortsetzen (für den nächsten Wert in der Liste), indem Sie den Continue-Befehl wie unten gezeigt verwenden.
Im folgenden Beispiel wird "(WEEKEND)" zu Sa und So und "(Wochentag)" zu den restlichen Tagen hinzugefügt.
$ cat for7.sh i=1 for day in Mon Tue Wed Thu Fri Sat Sun do echo -n "Day $((i++)) : $day" if [ $i -eq 7 -o $i -eq 8 ]; then echo " (WEEKEND)" continue; fi echo " (weekday)" done $ ./for7.sh Day 1 : Mon (weekday) Day 2 : Tue (weekday) Day 3 : Wed (weekday) Day 4 : Thu (weekday) Day 5 : Fri (weekday) Day 6 : Sat (WEEKEND) Day 7 : Sun (WEEKEND)
8. Bash for loop mit C-Programmsyntax
In diesem Beispiel wird die 2. Methode der Bash-For-Loop verwendet, die der C-For-Loop-Syntax ähnelt. Das folgende Beispiel generiert 5 Zufallszahlen mit der for-Schleife im Bash-C-Stil.
$ cat for8.sh for (( i=1; i <= 5; i++ )) do echo "Random number $i: $RANDOM" done $ ./for8.sh Random number 1: 23320 Random number 2: 5070 Random number 3: 15202 Random number 4: 23861 Random number 5: 23435
9. Endlose Bash for-Schleife
Wenn Sie den Start, die Bedingung und das Inkrement in der For-Schleife im Bash-C-Stil nicht angeben, wird daraus eine Endlosschleife. Sie müssen Strg-C drücken, um die Schleife zu stoppen.
$ cat for9.sh i=1; for (( ; ; )) do sleep $i echo "Number: $((i++))" done
Wie oben gesagt, drücken Sie Strg-C, um aus diesem Bash-Beispiel für eine unendliche For-Schleife auszubrechen.
$ ./for9.sh Number: 1 Number: 2 Number: 3
10. Verwenden von Kommas in der for-Schleife im Bash-C-Stil
In der Bash-Schleife im C-Stil können Sie neben dem Erhöhen des Werts, der in der Bedingung verwendet wird, auch einen anderen Wert erhöhen, wie unten gezeigt.
Im initialize-Abschnitt und im increment-Abschnitt der for-Schleife im Bash-C-Stil können Sie mehrere Werte haben, indem Sie sie wie unten gezeigt durch Kommas trennen.
Die folgende for-Schleife wird insgesamt 5 Mal ausgeführt, wobei die Variable i verwendet wird. Die Variable j beginnt jedoch mit 5 und wird jedes Mal um 5 erhöht, wenn die Schleife ausgeführt wird.
$ cat for10.sh for ((i=1, j=10; i <= 5 ; i++, j=j+5)) do echo "Number $i: $j" done $ ./for10.sh Number 1: 10 Number 2: 15 Number 3: 20 Number 4: 25 Number 5: 30
11. Nummernbereich nach dem Schlüsselwort „in“
Sie können den Zahlenbereich in der for-Schleife „in“ mithilfe der geschweiften Erweiterung durchlaufen.
Das folgende Beispiel wird 10 Mal durchlaufen, wobei die Werte 1 bis 10 verwendet werden.
$ cat for11.sh for num in {1..10} do echo "Number: $num" done $ ./for11.sh Number: 1 Number: 2 Number: 3 Number: 4 Number: 5 ...
12. Nummernbereich mit Inkrementen nach dem Schlüsselwort „in“
Das folgende Beispiel wird 5 Mal durchlaufen, wobei die Werte 1 bis 10 verwendet werden, mit einem Inkrement von 2. Das heißt, es beginnt mit 1 und erhöht sich um 2, bis es 10 erreicht.
$ cat for12.sh for num in {1..10..2} do echo "Number: $num" done $ ./for12.sh Number: 1 Number: 3 Number: 5 Number: 7 Number: 9
PS: Vergessen Sie nicht, diesen Artikel als zukünftige Referenz zu markieren.