Schleifen bash Tutorial Teil 12

Wie Verzweigungen gehören Schleifen zu den Kontrollstrukturen, mit der der lineare Ablauf unterbrochen wird. Schleifen sollen uns in erster Linie Arbeit ersparen, in dem wir einen Codeblock mehrfach durchlaufen könne, ohne ihn mehrmals eintippen zu müssen.

bash Logo - Schleifen
Dr. Dirk Colbry, Michigan State
Gnu-bash-logoCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
1Einführung
2Der bash Prompt
3key bindings
4Der Startvorgang
5Environment Variablen
6builtin commands
7Arbeiten mit Dateien
8nano
9bash Scripting
10Variablen
11Verzweigungen (if)
12Schleifen
13Kommandozeilenparameter
14exit Codes bash Tutorial Teil 14
15von der Idee zum Script
16grep
17Piping und Redirection
18tee

Schleifen

Schau dir mal folgendes Beispiel an:

# noloop.sh


echo "1"
echo "und"
echo "1"
echo "und"
echo "1"
echo "und"
echo "1"
echo "und"
echo "1"
echo "und"
echo "aus"

Es gibt fünfmal eine Zeile „1“ gefolgt von einer Zeile „und“ aus. Als Letztes wird noch eine Zeile „aus“ gedruckt.

Ausgabe von noloop.sh
Olli Graf - raspithek.de
noloopCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Ausgabe von noloop.sh

Das Programm tut zwar, was es soll, hat aber einen eklatanten Nachteil. Wenn wir jetzt beispielsweise statt „1“ eine „2“ ausgeben wollten, müssen wir fünf Zeilen im Script ändern (gut, wir hätten den Ausgabewert auch in einer Variable ablegen können, aber darum geht’s hier nicht). Eleganter geht das mit einer Schleife.

Die while Schleife

Die while Schleife ist immer so aufgebaut:

while [ Bedingung ]; do
Anweisungsblock
done

Sie führt den Anweisungsblock so lange aus, wie die Bedingung erfüllt ist. Für die Bedingung gilt das gleich wie bei if beschrieben.

Wir führen jetzt einen Zähler ein, der im Anweisungsblock hochgezählt wird. Wenn dieser den Wert 5 erreicht, endet die Schleife

# whileloop.sh

count=1

while [ ${count} -le 5 ]; do
  echo "1"
  echo "und"
  count=$((${count} + 1))
done
echo "aus"
Olli Graf - raspithek.de
whileCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=

Until Schleife

Die until Loop ist while syntaktisch sehr ähnlich, allerdings wird die Bedingung anders interpretiert. Während while solange läuft, wie die Bedingung erfüllt ist, läuft until bis die Bedingung erfüllt ist. Ein anderer Unterschied ist, dass while die Bedingung vor dem Anweisungsblock prüft, until macht dies danach. Das Beispiel von oben sieht mit until so aus:

# untilloop.sh

count=1

until [ ${count} -eq 5 ]; do
  echo "1"
  echo "und"
  count=$((${count} + 1))
done
echo "aus"
Die Ausgabe von until ist identisch zu while ( wie gewünscht)
Olli Graf -raspithek.de
untilCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Die Ausgabe von until ist identisch zu while ( wie gewünscht)

until wird scheinbar eher selten benutzt, zumindest sehe ich diese Schleifenart kaum. Die Bedingung ist erfüllt, wenn count einen Wert von 5 hat. Da dies unmittelbar nach dem Inkrementieren passiert, wird der Schleifenblock nur viermal durchlaufen.

Die for Schleife

Während while und until durch eine Bedingung gesteuert werden, läuft die for Loop über eine Liste von Elementen. Dies kann eine Liste sein, die im Script selber aufgebaut wird oder bspw. eine Liste von Dateien in einem Verzeichnis.

#forloop.sh

#Ausgabe der ungeraden Zahlen bis 10
for i in 1 3 5 7 9; do
  echo "i=${i}"
done

#Ausgabe aller Dateien in /etc

for d in /etc/*; do
  echo "${d}"
done

Die erste for Loop läuft über die Liste mit den ungeraden Zahlen zwischen 0 und 10 und gibt diese aus. Die zweite Schleife zeigt, wie du relativ einfach mit for über die Liste aller Files in /etc iterieren kannst.

Schleifen abbrechen

Manchmal kommt es vor, dass du eine Schleife vorzeitig abbrechen musst. Dafür steht das break Kommando zur Verfügung.

In diesem Beispiel brechen wir die Ausgabe der ungeraden Zahl nach dem Wert 5 ab.

#break.sh

#Ausgabe der ungeraden Zahlen bis 10
for i in 1 3 5 7 9; do
  if [ ${i} -eq 5 ]; then
    break
  fi

  echo "i=${i}"
done

Durchlauf überspringen

Ebenso kommt es vor, dass du einen Schleifendurchlauf überspringen musst. Dazu dient continue.

Wir lassen in diesem Beispiel den Wert 5 einfach aus:

#continue.sh

#Ausgabe der ungeraden Zahlen bis 10
for i in 1 3 5 7 9; do
  if [ ${i} -eq 5 ]; then
    continue
  fi

  echo "i=${i}"
done

Endlosschleifen

Achte bei allen Schleifentypen darauf, dass du die Bedingung so wählst, dass die Schleife zum Ende kommen kann, sonst läuft dein Script für alle Ewigkeiten! Die Liste der ungeraden Zahlen hat eine definierte Anzahl von Elementen, die ein Schleifenende impliziert. Ebenso verhält es sich mit der Liste der Dateien in einem Verzeichnis. Wenn du allerdings innerhalb einer Zählschleife vergisst, den

Fazit

Schleifen sind unverzichtbar, um sich mehrfach wiederholende Kommandos einfach und elegant auszuführen.Sie werden dir immer wieder begegnen.

Schreibe einen Kommentar

Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Olli Graf - raspithek.de
WordPress Cookie Hinweis von Real Cookie Banner