Schleifenanweisungen werden verwendet, um ein Programm zu zwingen, eine Anweisung wiederholt auszuführen. Die ausgeführte Anweisung wird Schleifenrumpf genannt.
Schleifen werden ausgeführt, bis der Wert eines steuernden Ausdrucks 0 ist. Der steuernde Ausdruck kann ein beliebiger skalarer Datentyp sein.
Die Shell-Sprache bietet auch mehrere Iterations- oder Schleifenanweisungen. Lassen Sie uns in diesem Artikel anhand einiger Beispiele die Schleifenanweisungen überprüfen, die bash bereitstellt.
Bash unterstützt die folgenden drei Arten von Schleifenanweisungen
- For-Schleife
- While-Schleife
- Until-Schleife
Dieser Artikel ist Teil der fortlaufenden Bash-Tutorial-Reihe.
Schleifen können verschachtelt werden. Wie jede andere Programmiersprache unterstützt auch bash die Break-Anweisung, um die aktuelle Schleife zu verlassen, und die Continue-Anweisung, um die nächste Iteration der Schleifenanweisung fortzusetzen.
Bash-For-Schleife – Erste Methode
For-Schleifen werden normalerweise verwendet, wenn die Anzahl der Iterationen vor dem Eintritt in die Bash-Schleife bekannt ist. Bash unterstützt zwei Arten von for-Schleife. Die erste Form von bash for loop ist:
for varname in list do commands ##Body of the loop done
In obiger Syntax:
- for, in, do und done sind Schlüsselwörter
- Liste ist eine beliebige Liste, die eine Liste von Elementen enthält
- varname ist ein beliebiger Bash-Variablenname.
In dieser Form führt die for-Anweisung den in einem Hauptteil eingeschlossenen Befehl einmal für jedes Element in der Liste aus. Das aktuelle Element aus der Liste wird bei jedem Schleifendurchlauf in einer Variablen „varname“ gespeichert. Dieser Varname kann im Körper der Schleife verarbeitet werden. Diese Liste kann eine Variable sein, die mehrere durch Leerzeichen getrennte Wörter enthält. Wenn die Liste in der for-Anweisung fehlt, nimmt sie den Positionsparameter, der an die Shell übergeben wurde.
Beispiel für eine Bash-For-Schleife 1. Entpacken Sie die gesamte Zip-Datei
Das folgende Beispiel findet die Liste der Dateien, die mit „*.zip*“ im Stammverzeichnis übereinstimmen, erstellt ein neues Verzeichnis am selben Ort, an dem sich die Zip-Datei befindet, und entpackt den Inhalt der Zip-Datei.
# cat zip_unzip.sh #! /bin/bash # Find files which has .zip for file in `find /root -name "*.zip*" -type f` do # Skip the extension .zip dirname=`echo ${file} | awk -F'.' '{print $1}'` # Create the directory mkdir $dirname # Copy the zip file cp ${file} ${dirname} cd $dirname # Unzip the zip file from newly created directory unzip ${dirname}/$(echo ${file##/*/}) done
- In diesem Beispiel gibt der find-Befehl die Liste der Dateien zurück, von denen jede Datei durch eine Schleife verarbeitet wird.
- Für jedes Element erstellt es das Verzeichnis mit dem Namen der ZIP-Datei, kopiert die ZIP-Datei in das neu erstellte Verzeichnis und entpackt die ZIP-Datei von dort.
- Die echo-Anweisung echo ${file##/*/} gibt Ihnen nur den Dateinamen, nicht den Pfad.
# ./zip_unzip.sh Archive: /root/test2/test2.zip extracting: t1/p extracting: t1/q extracting: t1/r extracting: t1/s extracting: t1/t extracting: t1/u extracting: t1/v Archive: /root/test1/test1.zip extracting: t/a extracting: t/b extracting: t/c extracting: t/d extracting: t/e
Ähnlich wie die Bash-Schleife bietet Awk auch eine For-Schleife und eine While-Schleife, wie wir in unserem Artikel Awk While and For Loop besprochen haben.
Bash-For-Schleife – Zweite Methode
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 commands done
- In der obigen Bash für die Befehlssyntax wird expr1 vor der ersten Iteration 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 erhöhen.
Das folgende Beispiel generiert die Anzahl n Zufallszahlen.
Bash für Beispiel 2. Erzeuge n Zufallszahlen
$ cat random.sh #! /bin/bash echo -e "How many random numbers you want to generate" read max for (( start = 1; start <= $max; start++ )) do echo -e $RANDOM done $ ./random.sh How many random numbers you want to generate 5 6119 27200 1998 12097 9181
Im obigen Code-Snippet generiert die for-Schleife die Zufallszahl maximal oft. RANDOM ist eine interne Bash-Funktion, die bei jedem Aufruf eine zufällige Ganzzahl zurückgibt.
Bash-While-Schleife
Eine weitere Iterationsanweisung, die von der Shell-Programmiersprache angeboten wird, ist die while-Anweisung.
Syntax: while expression do commands done
In der obigen While-Schleifensyntax:
- while, do, done sind Schlüsselwörter
- Ausdruck ist ein beliebiger Ausdruck, der einen Skalarwert zurückgibt
- While-Anweisung bewirkt, dass ein Codeblock ausgeführt wird, während ein bereitgestellter bedingter Ausdruck wahr ist.
Bash While Beispiel 3. Inhalt in eine Datei schreiben
Das folgende Beispiel liest die Daten aus der stdout und schreibt sie in eine Datei.
$ cat writefile.sh #! /bin/bash echo -e "Enter absolute path of the file name you want to create" read file while read line do echo $line >> $file done $ sh writefile.sh Enter absolute path of the file name you want to create /tmp/a while for until $ cat /tmp/a while for until
Das obige Beispiel liest den Dateinamen vom Benutzer und liest die Datenzeilen von stdin und hängt jede Zeile an einen bestimmten Dateinamen an. Wenn EOF eintritt, schlägt das Lesen fehl, also endet die Schleife dort.
Wenn Sie viele Bash-Skripte schreiben, können Sie den Vim-Editor als Bash-IDE verwenden, indem Sie das Vim-Plugin bash-support verwenden, wie wir bereits besprochen haben.
Bash While Beispiel 4. Lesen Sie den Inhalt einer Datei
Im vorherigen Beispiel liest es die Daten von stdout und schreibt sie in eine Datei. In diesem Beispiel liest es den Inhalt der Datei
und schreibt ihn in eine Standardausgabe.
$ cat read.sh #! /bin/bash echo -e "Enter absolute path of the file name you want to read" read file exec <$file # redirects stdin to a file while read line do echo $line done $ ./read.sh Enter absolute path of the file name you want to read /tmp/a while for until
In diesem Beispiel erhält es den zu lesenden Dateinamen und leitet mit exec stdin in eine Datei um. Von diesem Zeitpunkt an stammen alle Standardeinstellungen aus dieser Datei und nicht von der Tastatur. read-Befehl liest die Zeile von stdin, also liest while loop die stdin, bis EOF auftritt.
Bash-Until-Schleife
Die until-Anweisung ist in Syntax und Funktion der while-Anweisung sehr ähnlich. Der einzige wirkliche Unterschied zwischen den beiden besteht darin, dass die until-Anweisung ihren Codeblock ausführt, während ihr bedingter Ausdruck falsch ist, und die while-Anweisung ihren Codeblock ausführt, während ihr bedingter Ausdruck wahr ist.
syntax: until expression do commands #body of the loop done
In der obigen Bash-Tail-Syntax:
wo until, do, done Schlüsselwörter sind
expression beliebiger bedingter Ausdruck
Bash bis Beispiel 5. Protokolldatei überwachen
Dieses Beispiel überwacht die Größe der Protokolldatei. Sobald die Größe der Protokolldatei 2000 Byte erreicht, wird die Kopie dieser Protokolldatei verwendet.
$ cat monitor.sh file=/tmp/logfile until [ $(ls -l $file | awk '{print $5}') -gt 2000 ] do echo "Sleeping for next 5 seconds" sleep 5 done date=`date +%s` cp $file "$file-"$date.bak $ ./monitor.sh Sleeping for next 5 seconds Sleeping for next 5 seconds $ ls -l /tmp/logfile* -rw-r--r-- 1 sss sss 2010 Jun 24 12:29 logfile -rw-r--r-- 1 sss sss 2005 Jun 24 16:09 logfile-1277474574.bak
Die until-Anweisung fährt fort, den Rumpf der Schleife auszuführen, bis die Bedingung wahr wird. In diesem Beispiel ist die Bedingung größer als 2000 Bytes, sodass die Datei kopiert wird, sobald sie die 2000 Bytes erreicht hat.
Beachten Sie auch unsere früheren Bash-Array-Beispiele.
Bash bis Beispiel 6. Warten auf den Start der Maschine
Dieses Beispiel wird verwendet, um zu warten, bis die Maschine hochfährt, bevor eine SSH-Verbindung zu dieser Maschine ausgeführt wird. Die until-Schleife endet erst, wenn der Ping die Antworten liefert.
$ cat mac_wait.sh #! /bin/bash read -p "Enter IP Address:" ipadd echo $ipadd until ping -c 1 $ipadd do sleep 60; done ssh $ipadd $./mac_wait.sh Enter IP Address:192.143.2.10 PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data. --- 192.143.2.10 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data. 64 bytes from 192.143.2.10: icmp_seq=1 ttl=64 time=0.059 ms --- 192.143.2.10 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.059/0.059/0.059/0.000 ms The authenticity of host '192.143.2.10 (192.143.2.10)' can't be established. Are you sure you want to continue connecting (yes/no)? yes
Die Until-Schleife ist auf der Befehlszeile sehr nützlich, um auf das Eintreten bestimmter Ereignisse zu warten.