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

Bash-Scripting – For-Schleife mit Beispielen erklärt

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.

  1. For-Schleife
  2. While-Schleife
  3. 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 die for 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 Variablen val wird gedruckt.
  • Der Befehl ((++N )) fungiert als Zähler und erhöht den Variablenwert N damit es im echo 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 Startwert
  • Y =Integer-Endwert
  • Incr =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 zwischen do und die done Block wird ausgeführt.
  • Der Zähler YEAR++ erhöht das Jahr um einen Zähler. Bis zur Variable YEAR wird auf 2020 erhöht , wird die Schleife wiederholt.
  • Innerhalb von do und done 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

Linux
  1. Bash For Loop Guide und Beispiele

  2. Bash für Schleife

  3. Beispiele für Bash-For- und While-Schleifen

  4. 12 Bash-For-Loop-Beispiele für Ihr Linux-Shell-Scripting

  5. Bash für Schleifenbeispiele

Bash-Scripting – Assoziatives Array mit Beispielen erklärt

Bash-Scripting – Indiziertes Array mit Beispielen erklärt

Bash For-Schleifen mit Beispielen

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

Die Bash FOR-Schleife erklärt und vereinfacht

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