In einem Shell-Skript kommt es oft vor, dass Sie eine Anweisung oder eine Gruppe von Anweisungen wiederholt ausführen möchten, bis eine bestimmte Bedingung eintritt. Außerdem möchten Sie möglicherweise eine Gruppe von Anweisungen für jedes Element in einer bestimmten Liste ausführen. Die Shell bietet drei Schleifenkonstrukte für diese Situationen:die for-, while- und until-Konstrukte.
Mit der for-Schleife können Sie eine Liste von Werten angeben. Für jeden Wert in der Liste wird eine Gruppe von Anweisungen ausgeführt.
For-Schleifen-Syntax
Die for-Schleife in der Shell nimmt eine Liste von Wörtern (Strings) als Argument. Die Anzahl der Wörter in der Liste bestimmt, wie oft die Anweisungen in der for-Schleife ausgeführt werden. Die Syntax für die for-Schleife lautet:
for variable in element1 element2 element3 do commands done
wo:
- Variable :Es ist ein beliebiger Variablenname.
- Elemente (Argument_Liste) :Es kann eine beliebige Liste von Wörtern, Zeichenketten oder Zahlen sein, und es kann wörtlich oder durch Verwendung eines Shell-Befehls oder eines Shell-Befehlszeilen-Metazeichens generiert werden.
- Befehle :Die Befehle können beliebige Betriebssystembefehle, ein Benutzerprogramm, ein Shell-Skript oder eine Shell-Anweisung sein, die eine Liste zurückgibt (erzeugt).
Der Wert der Variablen var wird beim ersten Schleifendurchlauf auf das erste Wort in der Liste gesetzt. Beim zweiten Schleifendurchlauf wird sein Wert auf das zweite Wort in der Liste gesetzt und so weiter. Die Schleife endet, wenn var der Reihe nach jeden der Werte aus der Argumentliste angenommen hat und es keine verbleibenden Argumente mehr gibt.
Die for-Schleifen-Argumentliste
Die Argumentliste in einer for-Schleife kann eine beliebige Liste von Wörtern sein , Saiten , oder Zahlen . Generieren Sie die Argumentliste mit einer der folgenden Methoden (oder einer Kombination von Methoden):
- Verwenden Sie eine explizite Liste
- Den Inhalt einer Variablen verwenden
- Verwenden Sie Befehlszeilenargumente
- Befehlsersetzung verwenden
- Verwenden Sie Dateinamen bei der Befehlsersetzung
Beispiel 1:For-Schleife mit einer expliziten Liste zur Angabe von Argumenten
Wenn Argumente für eine for-Schleife aufgelistet werden, spricht man von einer expliziten Liste. Eine explizite Liste ist die einfachste Form einer Argumentliste. Die Schleife wird für jedes Listenelement einmal ausgeführt. Das folgende Beispiel ist eine for-Schleife, die eine explizite Liste von Elementen verwendet:
#!/bin/bash for fruit in apple orange banana peach kiwi do echo "Value of fruit is: $fruit" done
Die Ausgabe dieser for-Schleife ist:
Value of fruit is: apple Value of fruit is: orange Value of fruit is: banana Value of fruit is: peach Value of fruit is: kiwi
Beispiel 2:For-Schleife mit Variableninhalten zur Angabe von Argumenten
Wenn sich die Argumente in einer Variablen befinden und die Anweisung ausgeführt wird, werden die Variableninhalte ersetzt. Im folgenden Beispiel wird der an der Eingabeaufforderung eingegebene Text zum Wert der Variablen INPUT. Diese Variable repräsentiert die Argumentliste des for-Konstrukts. Daher wird der Text in INPUT basierend auf Leerzeichen in Wörter oder Token aufgeteilt.
$ cat ex1.sh #!/bin/bash # Script name: ex1.sh echo "Enter some text: \c" read INPUT for var in $INPUT do echo "var contains: $var" done
$ ./ex1.sh Enter some text: I like the Bash shell. var contains: I var contains: like var contains: the var contains: Korn var contains: shell.
Beispiel 3:For-Schleife mit Befehlszeilenargumenten zur Angabe von Argumenten
Im folgenden Beispiel wird der in der Befehlszeile eingegebene Text zur Argumentliste des for-Konstrukts. Daher wird der Befehlszeilentext basierend auf Leerzeichen in Wörter oder Tokens aufgeteilt.
$ cat ex2.sh #!/bin/bash # Script name: ex2.sh for var in $* do echo "command line contains: $var" done
$ ./ex2.sh I am The Geek. command line contains: I command line contains: am command line contains: The command line contains: Geek.
Beispiel 4:For-Schleife mit Befehlsersetzung zur Angabe von Argumenten
Die Syntax für die Befehlsersetzung in einer Bash-Shell lautet:
for var in `cmd_sub`
Das folgende Beispiel verwendet die Ausgabe des cat-Befehls als Argumentliste.
$ cat fruit1 apple orange banana peach kiwi
$ cat ex4.sh #!/bin/bash # Script name: ex4.sh for var in `cat fruit2` do echo "var contains: $var" done
$ ./ex4.sh var contains: Apple var contains: Orange var contains: Banana var contains: Peach var contains: Kiwi
Wenn die Datei mit der Liste das folgende Format hatte, was ist das Ergebnis der for-Schleife.
$ cat fruit3 Apple Orange Banana Peach Kiwi
$ cat ex5.sh #!/bin/bash # Script name: ex5.sh for var in `cat fruit3` do echo "$var" done
$ ./ex5.sh Apple Orange Banana Peach Kiwi
Im obigen Beispiel ändern sich die Ergebnisse nicht. Die IFS-Variable ist ein beliebiges Leerzeichen, sodass jedes Feld in der Datei sowohl durch einen Wagenrücklauf als auch durch ein Leerzeichen oder einen Tabulator getrennt wird.
Beispiel 5:For-Schleife mit Dateinamen in Befehlsersetzung zur Angabe von Argumenten
Einige Befehle liefern Dateinamen und Verzeichnisnamen als Ausgabe. Im folgenden Beispiel ersetzt die Shell die Ausgabe des Befehls ls /etc/p*(/etc/passwd/etc/profileusw.) als Argumentliste für die for-Schleife.
$ cat ex7.sh #!/bin/bash # Script name: ex7.sh for var in `ls /etc/p*` do print "var contains: $var" done
# ./x.sh var contains: /etc/passwd var contains: /etc/passwd- var contains: /etc/printcap var contains: /etc/profile ....Beispiele für Bash-if-Schleifen (if then fi, if then elif fi, if then else fi)