GNU/Linux >> LINUX-Kenntnisse >  >> Linux

12 Bash-For-Loop-Beispiele für Ihr Linux-Shell-Scripting

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.


Linux
  1. Bash For Loop Guide und Beispiele

  2. Linux-Scripting:3 Anleitungen für While-Schleifen in Bash

  3. Beispiele für Bash-For- und While-Schleifen

  4. Bleiben Sie auf dem Laufenden – Beispiele für Bash-For-, While- und Until-Loops

  5. Bash für Schleifenbeispiele

Bash For-Schleifen mit Beispielen

Shell-Scripting für Anfänger – So schreiben Sie Bash-Scripts unter Linux

Bash For Loop – Die praktischste Anleitung

Bash Shell PS1:10 Beispiele, um Ihr Linux wie Angelina Jolie zu machen

Bash Scripting Einführungstutorial mit 5 praktischen Beispielen

Bash-Skript für Schleife mit Beispielen erklärt