Beim Bash-Shell-Skripting sind Schleifen nützlich, um sich wiederholende Aufgaben zu automatisieren. Wenn Sie eine Aufgabe in Ihrem Skript N-mal wiederholen müssen, sollten Schleifen verwendet werden. Es gibt drei Arten von Schleifen, die in Bash unterstützt werden.
- For-Schleife
- While-Schleife
- Until-Schleife
Alle drei Schleifen dienen dem gleichen Zweck, die Aufgabe N Mal zu wiederholen, wenn eine Bedingung erfüllt ist, jedoch mit Unterschieden in der Art und Weise, wie sie definiert und verwendet werden, um das Ergebnis zu erzielen.
Dieser Artikel konzentriert sich auf die "for-Schleife" in Bash-Skripten. Wir werden in unserer nächsten Anleitung mehr über die anderen beiden Schleifen erfahren.
For-Schleifen-Syntax
Das Verständnis der Syntax ist sehr wichtig, bevor Sie Ihre erste for loop
schreiben .
for NAME in [ LIST OF ITEMS ] do Command 1 Command 2 ..... Command N done
Lassen Sie uns es aufschlüsseln und sehen, was es tut.
- Beginnen Sie mit dem Schlüsselwort
"for"
gefolgt von einem Variablennamen. - Das Schlüsselwort
"in"
Holen Sie sich die Liste der Elemente und speichern Sie sie in der Variablen für jede Iteration. - Das Schlüsselwort
"do"
und"done"
markiert den Anfang und das Ende des Schleifenblocks und der Befehl sollte zwischen do und done geschrieben werden. - Es gibt keine strengen Einrückungsregeln, aber zur besseren Lesbarkeit verwenden Sie 2 Leerzeichen oder Tab(4) . Verwenden Sie in Ihrem Skript konsequent entweder Leerzeichen oder Tabulatoren.
Sie können auch eine einzelne Linie für Schleifen erstellen. Erstellen Sie eine for loop
im Terminal und drücken Sie die Aufwärtspfeiltaste und Sie werden sehen, dass bash es automatisch in eine einzeilige Schleife umwandelt.
for NAME in [ LIST OF ITEMS]; do COMMANDS ; done
Beispiel 1 – Arbeiten mit Artikellisten
Beginnen wir mit einem einfachen Beispiel.
Aus dem vorherigen Abschnitt haben Sie vielleicht verstanden, dass die for loop
akzeptiert eine Liste von Elementen. Die Liste der Elemente kann alles sein wie Strings, Arrays, Ganzzahlen, Bereiche, Befehlsausgaben usw.
Öffnen Sie das Terminal und führen Sie den folgenden Code aus.
N=1 for val in Welcome To Ostechnix do echo "Iteration $N → $val" ((++N)) done
Lassen Sie es uns aufschlüsseln.
"Welcome to Ostechnix"
ist die Liste der Elemente, die an diefor loop
übergeben werden und jedes Wort wird als separate Iteration ausgewählt und in einer Variablen gespeichert (val
).- Die Variable kann beliebig benannt werden. Hier nenne ich es als
val
. - Es gibt drei Elemente in der Liste, also gibt es drei Iterationen in der
for loop
und jeweils den Wert der Variablenval
wird gedruckt. - Der Befehl ((
++N
)) fungiert als Zähler und erhöht den VariablenwertN
damit es imecho
ausgedruckt werden kann Erklärung.
Jetzt, nachdem Sie die obige for loop
ausgeführt haben Befehl drücken Sie die Aufwärtspfeiltaste vom Terminal und Sie können die mehrzeilige for loop
sehen wird für eine Schleife in eine einzelne Zeile umgewandelt.
Beispiel 2 – Arbeiten mit Bereichen
Vielleicht möchten Sie die for loop
ausführen N mehrmals, dafür können Sie den in Bash integrierten Sequenzgenerator "{x..y[..incr]}"
verwenden wodurch eine Zahlenfolge generiert wird.
X
=Ganzzahliger StartwertY
=Integer-EndwertIncr
=optionaler ganzzahliger Wert, der ganze Zahlen inkrementiert
Angenommen, Sie möchten fünfmal eine for-Schleife ausführen, dann können Sie das folgende Snippet verwenden.
for rng in {1..5} do echo "Value is == $rng" done
Sie können auch den optionalen Increment-Parameter verwenden, der schrittweise Inkremente ausführt.
Schauen Sie sich das folgende Snippet an, wo das Inkrement von drei angegeben ist. Dadurch wird die Sequenz von eins generiert und eine Schrittweite von drei bis zum Endwert zehn ausgeführt.
for rng1 in {1..10..3} do echo "Value is == $rng1" done
Beispiel 3 - Ausführen von Befehlen
Sie können alle Befehle ausführen, die eine Liste von Elementen ableiten, die von for loop
verarbeitet werden sollen . Der Befehl sollte entweder mit Häkchen "``
" oder Klammern "$()
".
Im folgenden Beispiel führe ich den Befehl aus, der die Prozess-ID erhält und die letzten fünf Prozesse filtert. Die For-Schleife durchläuft nun jede Prozess-ID.
for list in $(ps -ef | awk {' print $2 '} | tail -n 5) do echo $list done
Beispiel 4 - Schleife über Array-Elemente
In Echtzeitszenarien speichern Sie einige Werte in Arrays und versuchen, das Array zur weiteren Verarbeitung zu durchlaufen.
Bevor Sie verstehen, wie ein Array durchlaufen wird, müssen Sie das Verhalten von zwei speziellen Variablen verstehen ([email protected]
und $*
). Beides sind spezielle Variablen, die verwendet werden, um auf alle Elemente eines Arrays zuzugreifen.
Führen Sie den folgenden Code im Terminal aus. Ein Array X erstellt wird und wenn ich versuche, alle Werte zu drucken ($X
) wie ich Variablen drucke, gibt es nur den ersten Wert aus dem Array zurück.
$ X=( 16 09 2021 "Thursday Third Week" )
$ echo $X
16
Um auf alle Elemente in einem Array zuzugreifen, müssen Sie entweder [email protected]
verwenden oder $*
. Die Syntax für den Zugriff auf Array-Werte lautet wie folgt.
$ echo ${X[@]}
16 09 2021 Thursday Third Week
$ echo ${X[*]}
16 09 2021 Thursday Third Week
Verwenden Sie dies nun mit for loop
um die Array-Werte zu durchlaufen.
X=( 16 09 2021 "Thursday Third Week" ) for items in ${X[@]} do echo $items done
Sehen Sie sich die obige Ausgabe an. Diese Ausgabe scheint falsch zu sein, da die Zeichenfolge (Thursday Third Week) innerhalb des Arrays als einzelner Wert betrachtet werden sollte. Aber hier wird jedes Element als separates Element behandelt.
Dies ist das Standardverhalten, wenn Sie [email protected]
verwenden oder $
. Um dies zu umgehen, schließen Sie die Array-Erweiterungsvariable ein ([email protected]
oder $
) in doppelten Anführungszeichen.
for items in "${X[@]}" do echo $items done
Wenn Sie doppelte Anführungszeichen verwenden, [email protected]
und $*
anders verhalten. Während [email protected]
erweitert das Array auf jedes Element in einem Array-ähnlichen, wie im obigen Beispiel gezeigt, $*
erweitert das gesamte Array als einen Wert.
for items in "${X[*]}" do echo $items done
Vorsicht: Beide [email protected]
und $*
verhalten sich identisch, sofern sie nicht in doppelte Anführungszeichen eingeschlossen sind . Versuchen Sie, $*
zu vermeiden es sei denn, es wird benötigt.
Beispiel 5 – C-Stil für Schleifensyntax
Bash bietet auch c an Stil for loop
Syntax. Wenn sie von einem C sind Sprachhintergrund, dann wird Ihnen diese Syntax nicht neu sein.
Anstatt durch eine Liste zu iterieren, werten Sie eine Bedingung aus und wenn die Bedingung wahr ist, werden die Befehle innerhalb der Schleife ausgeführt.
Es gibt drei Parameter, die Sie in dieser Syntax verstehen müssen.
- Variable - Eine Variable wird nur einmal initialisiert, wenn die Schleife ausgelöst wird.
- Zustand - Die Bedingung sollte wahr sein, damit die Schleife ausgeführt wird, sonst wird die Schleife nicht ausgeführt.
- Zähler - Dadurch wird der Variablenwert erhöht.
Jeder Parameter sollte durch ein Semikolon getrennt werden (;
) und sollte in doppelte Klammern eingeschlossen werden wie unten gezeigt.
for (( variable; condition; counter )) do Command 1 Command 2 Command N done
Sehen Sie sich das Schaltjahrbeispiel unten an.
- Die Variable
YEAR=2010
wird zuerst initialisiert. - Die Bedingung
YEAR<=20
ausgewertet und wenn ja der Code zwischendo
und diedone
Block wird ausgeführt. - Der Zähler
YEAR++
erhöht das Jahr um einen Zähler. Bis zur VariableYEAR
wird auf2020
erhöht , wird die Schleife wiederholt. - Innerhalb von
do
unddone
Block wird eine bedingte Anweisung geschrieben, um zu prüfen, ob das Jahr ein Schaltjahr ist oder nicht.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else echo "$YEAR = not a leap year" fi done
Beispiel 6 – Verwendung der Break, Continue-Anweisung
Es gibt zwei in Bash eingebaute Schlüsselwörter, die verwendet werden, um den Fluss Ihrer Schleifen zu steuern.
- Pause - Beendet die Schleife und überspringt alle anstehenden Iterationen.
- Weiter - Überspringen Sie die aktuelle Iteration und übergeben Sie die Steuerung zurück an die for-Schleife, um die nächste Iteration auszuführen.
Um zu überprüfen, ob sie in Bash integriert sind oder nicht, verwenden Sie type
Befehl:
$ type break continue break is a shell builtin continue is a shell builtin
Lassen Sie uns kurz sehen, wie und wo sowohl Pause als auch Fortsetzen verwendet werden können.
Ich verwende denselben Code, den ich im vorherigen Abschnitt verwendet habe, um das Schaltjahr zu finden. In diesem Fall brauche ich nur das erste Schaltjahr zwischen 2010 und 2020. Wenn dieses Jahr gefunden wird, kann meine Schleife beendet werden.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" break else echo "$YEAR = not a leap year" fi done
Aus der obigen Ausgabe können Sie for loop
sehen iteriert, und wenn das erste Schaltjahr 2012 gefunden wird, break
Die Anweisung wird gelesen, die Schleife verlassen und die Kontrolle an das Terminal zurückgegeben.
Jetzt ändere ich denselben Code für "continue"
Erklärung. Der continue
-Anweisung, wenn sie interpretiert wird, überspringt sie die aktuelle Iteration, d. h. den Code, der nach der Continue-Anweisung kommt, und übergibt die Steuerung zurück an for loop
um die nächste Iteration auszuführen.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else continue echo "$YEAR = not a leap year" fi done
Aus dem obigen Bild können Sie sehen, dass es eine Echo-Anweisung gibt, die von der Continue-Anweisung übersprungen wird.
Beispiel 7 – Verwendung von True-Anweisungen
Wenn Sie Schleifen oder bedingte Anweisungen erstellen, dürfen Sie den Codeblock nicht leer lassen. Bash gibt einen Syntaxfehler aus.
Schauen Sie sich die beiden obigen Bilder an. Im ersten Bild habe ich eine for loop
erstellt aber keine Befehle zwischen do
und done
. Ähnlich habe ich im zweiten Bild die else-Klausel leer gelassen. In beiden Fällen akzeptiert bash keine leeren Blöcke und gibt Syntaxfehler aus.
Sie können den in Bash integrierten “true"
verwenden Schlüsselwort, das den Exit-Code immer auf 0 setzt (Erfolg).
$ type true true is a shell builtin
Auf diese Weise lassen Sie den Codeblock leer, ohne dass Bash irgendwelche Fehler auswirft.
Schlussfolgerung
In diesem Bash-For-Loop-Leitfaden haben wir mit der Einführung in Schleifen und die Syntax von for loop
begonnen zusammen mit C-Stil. Wir haben auch gesehen, wie man for-Schleifen unter verschiedenen Bedingungen zusammen mit Schleifenkontrollanweisungen break und Continue verwendet. Sehen Sie sich unsere nächste Anleitung an, um mehr über Bash While
zu erfahren und Until
Schleifen mit Beispielen.
- Bash-Skripting – While- und Until-Schleife mit Beispielen erklärt
Verwandte Lektüre:
- Bash-Scripting – Funktionen mit Beispielen erklärt
- Bash-Scripting – Variablen mit Beispielen erklärt
- Bash-Echo-Befehl mit Beispielen in Linux erklärt
- Bash Heredoc-Tutorial für Anfänger
- Bash-Umleitung mit Beispielen erklärt
- Unterschied zwischen der Definition von Bash-Variablen mit und ohne Export