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

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

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

  1. For-Schleife
  2. While-Schleife
  3. 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.


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. In der Schleife gefangen? Awk While, Do While, For Loop, Break, Continue, Exit Beispiele

  5. Bash für Schleifenbeispiele

Bash For-Schleifen mit Beispielen

Bash For Loop – Die praktischste Anleitung

Bash-Scripting Teil 2 – For- und While-Schleifen mit Beispielen

Die While-Schleife in Shell-Skripten

Die Bash FOR-Schleife erklärt und vereinfacht

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