Vorsicht vor Endlosschleifen!
Die Schleifenfähigkeit ist ein sehr mächtiges Feature des Bash-Skriptings. Schleifen haben eine Vielzahl von Anwendungsfällen.
In diesem Tutorial lernen Sie die drei verschiedenen Bash-Loop-Strukturen kennen. Sie lernen auch, wie Sie Schleifen verwenden, um Array-Elemente zu durchlaufen.
Außerdem lernen Sie, wie Sie Break- und Continue-Anweisungen verwenden, um Schleifen zu steuern, und schließlich lernen Sie, wie Sie Endlosschleifen erstellen.
For-Schleifen in Bash
For-Schleifen sind eine von drei verschiedenen Arten von Schleifenstrukturen, die Sie in Bash verwenden können. Es gibt zwei verschiedene Arten, eine for-Schleife zu schreiben.
- For-Schleifen im C-Stil
- Verwendung einer for-Schleife für eine Liste/eine Reihe von Elementen
For-Schleifen im C-Stil in Bash
Wenn Sie mit einer C- oder C++-ähnlichen Programmiersprache vertraut sind, werden Sie die folgende For-Schleifen-Syntax erkennen:
for ((initialize ; condition ; increment)); do
[COMMANDS]
done
Unter Verwendung der oben erwähnten Syntax im C-Stil gibt die folgende for-Schleife zehnmal „Hallo Freund“ aus:
for ((i = 0 ; i < 10 ; i++)); do
echo "Hello Friend"
done
Die for-Schleife hat zuerst die Integer-Variable i initialisiert auf Null, dann testet es die Bedingung (i <10); wenn wahr, dann führt die Schleife die Zeile echo „Hello Friend“ aus und erhöht die Variablei um 1 , und dann läuft die Schleife immer wieder bis i nicht mehr kleiner als 10 ist .
[email protected]:~$ bash hello.sh
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Liste/Bereich für Schleifen in Bash
Es gibt auch eine andere Syntaxvariante der for-Schleife, die besonders nützlich ist, wenn Sie mit einer Liste von Dateien (oder Strings), Zahlenbereichen, Arrays, der Ausgabe eines Befehls usw. arbeiten. Die Liste/Bereich-Syntax für die Schleife hat die folgende Form :
for item in [LIST]; do
[COMMANDS]
done
Beispielsweise macht die folgende for-Schleife genau dasselbe wie die for-Schleife im C-Stil, die Sie im vorherigen Abschnitt erstellt haben:
for i in {1..10}; do
echo "Hello Friend"
done
Die var.sh Das folgende Skript gibt alle Dateien und Verzeichnisse aus, die unter /var vorhanden sind Verzeichnis:
#!/bin/bash
for i in /var/*; do
echo $i
done
Unten sehen Sie eine Beispielausgabe, wenn Sie das var.sh-Skript ausführen:
[email protected]:~$ ./var.sh
/var/backups
/var/cache
/var/crash
/var/lib
/var/local
/var/lock
/var/log
/var/mail
/var/metrics
/var/opt
/var/run
/var/snap
/var/spool
/var/tmp
While-Schleifen in Bash
Die While-Schleife ist eine weitere beliebte und intuitive Schleife, die Sie in Bash-Skripten verwenden können. Die allgemeine Syntax für eine While-Schleife lautet wie folgt:
while [ condition ]; do
[COMMANDS]
done
Zum Beispiel das folgende 3x10.sh Das Skript verwendet eine While-Schleife, die die ersten zehn Vielfachen der Zahl Drei ausgibt:
#!/bin/bash
num=1
while [ $num -le 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
Hier ist die Ausgabe des obigen Skripts:
[email protected]:~$ ./3x10.sh
3
6
9
12
15
18
21
24
27
30
Zuerst wurde dieZahl initialisiert Variable auf 1; dann läuft die While-Schleife so lange wie num kleiner oder gleich 10 ist . Innerhalb des Körpers der While-Schleife gibt der echo-Befehl num aus multipliziert mit drei und dann wird num erhöht um 1 .
Bis-Schleifen in Bash
Wenn Sie von einem C/C++-Hintergrund kommen, suchen Sie vielleicht nach einer do-while-Schleife, aber diese existiert nicht in bash.
Es gibt eine andere Art von Schleife, die in Bash existiert. Die until-Schleife folgt der gleichen Syntax wie die while-Schleife:
until [ condition ]; do
[COMMANDS]
Done
Der Hauptunterschied zwischen der until-Schleife und der while-Schleife liegt in der Testbedingung. Eine While-Schleife wird so lange ausgeführt, wie die Testbedingung wahr ist; Auf der anderen Seite läuft eine until-Schleife weiter, solange die Testbedingung falsch ist!
Beispielsweise können Sie ganz einfach 3x10.sh erstellen Skript mit einer until-Schleife statt einer while-Schleife; Der Trick dabei ist, die Testbedingung zu negieren:
#!/bin/bash
num=1
until [ $num -gt 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
Beachten Sie, dass die Negation der Testbedingung [ $num -le 10 ]; ist [ $num -gt 10 ];
Mehr über Schleifen in Bash-Skripten
Nun, da Sie mit den Schleifen in den Bash-Skripten vertraut sind
Den Inhalt eines Arrays in Bash drucken
Wenn Sie dieser Tutorial-Serie von Anfang an folgen, sollten Sie mit Arrays in Bash vertraut sein.
For-Schleifen sind oft die beliebteste Wahl, wenn es darum geht, über Array-Elemente zu iterieren.
Zum Beispiel die folgende prime.sh Das Skript iteriert jedes Element im Primzahl-Array und gibt es aus:
#!/bin/bash
prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
echo $i
done
Dies ist die Ausgabe des prime.sh-Skripts:
[email protected]:~$ ./prime.sh
2
3
5
7
11
13
17
19
23
29
Break und Continue in Bash-Schleifen verwenden
Manchmal möchten Sie eine Schleife möglicherweise vorzeitig verlassen oder eine Schleifeniteration überspringen. Dazu können Sie die Break- und Continue-Anweisungen verwenden.
Die Break-Anweisung beendet die Ausführung einer Schleife und schaltet die Programmsteuerung auf den nächsten Befehl oder die nächste Anweisung nach der Schleife um.
Die folgende Schleife würde beispielsweise nur die Zahlen von eins bis drei ausgeben:
for ((i=1;i<=10;i++)); do
echo $i
if [ $i -eq 3 ]; then
break
fi
done
Sie können auch ein Weiter verwenden -Anweisung, um eine Schleifeniteration zu überspringen. Die Schleife wird fortgesetzt und wechselt zur nächsten Iteration, aber die Befehle nach den Continue-Anweisungen werden in dieser bestimmten Iteration übersprungen.
Zum Beispiel die folgende odd.sh Skript würde nur die ungeraden Zahlen von eins bis zehn ausgeben, da es alle geraden Zahlen überspringt:
#!/bin/bash
for ((i=0;i<=10;i++)); do
if [ $(($i % 2)) -ne 1 ]; then
continue
fi
echo $i
done
Hier ist die Ausgabe, die ungerade Zahlen ausgibt:
[email protected]:~$ ./odd.sh
1
3
5
7
9
Endlosschleifen in bash
Eine Endlosschleife ist eine Schleife, die ewig läuft; dies geschieht, wenn die Schleifentestbedingung immer wahr ist.
In den meisten Fällen sind Endlosschleifen das Produkt eines menschlichen logischen Fehlers.
Zum Beispiel könnte jemand, der eine Schleife erstellen möchte, die die Zahlen 1 bis 10 in absteigender Reihenfolge ausgibt, versehentlich die folgende Endlosschleife erstellen:
for ((i=10;i>0;i++)); do
echo $i
done
Das Problem ist, dass die Schleife die Variablei ständig erhöht um 1 . Um das Problem zu beheben, müssen Sie i++ ändern mit i-- wie folgt:
for ((i=10;i>0;i--)); do
echo $i
done
In einigen Fällen möchten Sie möglicherweise absichtlich Endlosschleifen erstellen, um darauf zu warten, dass eine externe Bedingung auf dem System erfüllt wird. Sie können ganz einfach eine unendliche for-Schleife wie folgt erstellen:
for ((;;)); do
[COMMANDS]
done
Wenn Sie stattdessen eine unendliche While-Schleife erstellen möchten, können Sie diese wie folgt erstellen:
while [ true ]; do
[COMMANDS]
done
Fantastisch! Damit sind wir am Ende dieses Tutorials in der Bash Beginner Series angelangt. Ich hoffe, es hat Ihnen Spaß gemacht, in Bash herumzuschleifen!
Üben Sie nun das Schleifen mit einigen einfachen Übungen. Die Lösung erhalten Sie auch im PDF unten.
Bash-Kapitel-8-ÜbungsfragenProbleme und deren Lösung, um zu üben, was Sie gerade in diesem Kapitel gelernt habenBash-Kapitel-8-Übungsfragen-Linux-Handbuch.pdf28 KB
Sehen Sie sich das nächste Kapitel an, in dem Sie lernen, wie Sie Code in Ihren Bash-Skripten wiederverwenden, indem Sie Funktionen erstellen.