While: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(Die Seite wurde neu angelegt: „= while-Schleifen = *Die while-Schleife in der Bash führt Befehle so lange aus, wie eine bestimmte Bedingung erfüllt ist.* *Sie ist ideal, wenn die Anzahl d…“) |
|||
| Zeile 5: | Zeile 5: | ||
== Grundprinzip == | == Grundprinzip == | ||
| − | *Vor jedem Durchlauf wird die Bedingung geprüft. | + | *Vor jedem Durchlauf wird die Bedingung geprüft.* |
| − | Solange der Rückgabewert (Exit-Status) der Bedingung 0 ist, wird der Schleifenrumpf ausgeführt.* | + | *Solange der Rückgabewert (Exit-Status) der Bedingung '''0''' ist, wird der Schleifenrumpf ausgeführt.* |
*Ergibt die Bedingung einen anderen Wert, wird die Schleife beendet.* | *Ergibt die Bedingung einen anderen Wert, wird die Schleife beendet.* | ||
== Syntax == | == Syntax == | ||
| − | + | <syntaxhighlight lang="bash"> | |
| − | + | while [ Bedingung ] | |
| − | + | do | |
| + | Befehle | ||
| + | done | ||
| + | </syntaxhighlight> | ||
== Beispiel – Zählerschleife == | == Beispiel – Zählerschleife == | ||
*Ein einfaches Beispiel mit einer Zählvariablen.* | *Ein einfaches Beispiel mit einer Zählvariablen.* | ||
| − | + | <syntaxhighlight lang="bash"> | |
| − | + | ZAHL=1 | |
| − | + | while [ $ZAHL -le 5 ] | |
| − | + | do | |
| − | + | echo "Zahl: $ZAHL" | |
| + | ZAHL=$((ZAHL+1)) | ||
| + | done | ||
| + | </syntaxhighlight> | ||
Ausgabe: | Ausgabe: | ||
| Zeile 33: | Zeile 39: | ||
*Solange eine Datei nicht existiert, wartet die Schleife.* | *Solange eine Datei nicht existiert, wartet die Schleife.* | ||
| − | + | <syntaxhighlight lang="bash"> | |
| − | + | while [ ! -f /tmp/start.flag ] | |
| − | + | do | |
| − | + | echo "Warte auf Startdatei..." | |
| − | + | sleep 2 | |
| + | done | ||
| + | echo "Datei gefunden, starte Vorgang." | ||
| + | </syntaxhighlight> | ||
== Beispiel – Datei zeilenweise einlesen == | == Beispiel – Datei zeilenweise einlesen == | ||
*Die while-Schleife eignet sich sehr gut, um Dateien zeilenweise zu lesen.* | *Die while-Schleife eignet sich sehr gut, um Dateien zeilenweise zu lesen.* | ||
| − | + | <syntaxhighlight lang="bash"> | |
| − | + | while read ZEILE | |
| − | + | do | |
| + | echo "Zeile: $ZEILE" | ||
| + | done < /etc/passwd | ||
| + | </syntaxhighlight> | ||
Ausgabe (gekürzt): | Ausgabe (gekürzt): | ||
| Zeile 51: | Zeile 63: | ||
Zeile: bin:x:2:2:bin:/bin:/usr/sbin/nologin | Zeile: bin:x:2:2:bin:/bin:/usr/sbin/nologin | ||
| − | *Das Umleitungszeichen | + | *Das Umleitungszeichen '''<''' sorgt dafür, dass die Datei als Eingabequelle (STDIN) verwendet wird.* |
| − | *Jede Zeile wird nacheinander in die Variable ZEILE gelesen.* | + | *Jede Zeile wird nacheinander in die Variable '''ZEILE''' gelesen.* |
== Beispiel – Mit Exit-Status prüfen == | == Beispiel – Mit Exit-Status prüfen == | ||
| − | *Die Bedingung in der while-Schleife basiert auf dem Rückgabewert eines Befehls (0 = wahr, ≠0 = falsch).* | + | *Die Bedingung in der while-Schleife basiert auf dem Rückgabewert eines Befehls ('''0 = wahr''', '''≠0 = falsch''').* |
| − | *Dies kann auch mit | + | *Dies kann auch mit '''echo $?''' überprüft werden.* |
| − | + | <syntaxhighlight lang="bash"> | |
| − | + | ping -c1 10.0.0.1 > /dev/null 2>&1 | |
| − | + | echo $? | |
| + | 0 | ||
| − | + | while ping -c1 10.0.0.1 > /dev/null 2>&1 | |
| − | + | do | |
| − | + | echo "Host erreichbar" | |
| − | + | sleep 5 | |
| + | done | ||
| + | </syntaxhighlight> | ||
== Hinweise == | == Hinweise == | ||
| − | * Die Schleife wird beendet, sobald die Bedingung falsch ist (Exit-Code ≠ 0). | + | * Die Schleife wird beendet, sobald die Bedingung falsch ist (Exit-Code ≠ 0). |
| − | * Eine Endlosschleife kann mit | + | * Eine Endlosschleife kann mit '''while true; do … done''' erstellt werden. |
| − | * Mit | + | * Mit '''break''' kann die Schleife vorzeitig verlassen werden. |
| − | * Mit | + | * Mit '''continue''' wird der aktuelle Durchlauf übersprungen. |
| + | * Der aktuelle Exit-Status kann jederzeit mit '''echo $?''' angezeigt werden. | ||
== Aufgaben == | == Aufgaben == | ||
| − | * Erstellen Sie eine while-Schleife, die von 1 bis 10 zählt und jede Zahl ausgibt. | + | * Erstellen Sie eine while-Schleife, die von 1 bis 10 zählt und jede Zahl ausgibt. |
| − | * Schreiben Sie ein Skript, das alle Zeilen einer Datei | + | * Schreiben Sie ein Skript, das alle Zeilen einer Datei '''/etc/passwd''' einliest und nur die ersten fünf Zeilen ausgibt. |
| − | * Erstellen Sie eine Endlosschleife, die alle 3 Sekunden prüft, ob eine Datei | + | * Erstellen Sie eine Endlosschleife, die alle 3 Sekunden prüft, ob eine Datei '''/tmp/testfile''' existiert, und beendet sich, wenn sie gefunden wird. |
| − | * Erweitern Sie das Skript um die Ausgabe des Rückgabewerts | + | * Erweitern Sie das Skript um die Ausgabe des Rückgabewerts mit '''echo $?''' nach jeder Prüfung. |
Version vom 17. Oktober 2025, 15:37 Uhr
while-Schleifen
- Die while-Schleife in der Bash führt Befehle so lange aus, wie eine bestimmte Bedingung erfüllt ist.*
- Sie ist ideal, wenn die Anzahl der Wiederholungen im Voraus nicht bekannt ist – z. B. beim Einlesen von Daten oder bei Wartebedingungen.*
Grundprinzip
- Vor jedem Durchlauf wird die Bedingung geprüft.*
- Solange der Rückgabewert (Exit-Status) der Bedingung 0 ist, wird der Schleifenrumpf ausgeführt.*
- Ergibt die Bedingung einen anderen Wert, wird die Schleife beendet.*
Syntax
while [ Bedingung ]
do
Befehle
done
Beispiel – Zählerschleife
- Ein einfaches Beispiel mit einer Zählvariablen.*
ZAHL=1
while [ $ZAHL -le 5 ]
do
echo "Zahl: $ZAHL"
ZAHL=$((ZAHL+1))
done
Ausgabe: Zahl: 1 Zahl: 2 Zahl: 3 Zahl: 4 Zahl: 5
Beispiel – Wartebedingung
- Solange eine Datei nicht existiert, wartet die Schleife.*
while [ ! -f /tmp/start.flag ]
do
echo "Warte auf Startdatei..."
sleep 2
done
echo "Datei gefunden, starte Vorgang."
Beispiel – Datei zeilenweise einlesen
- Die while-Schleife eignet sich sehr gut, um Dateien zeilenweise zu lesen.*
while read ZEILE
do
echo "Zeile: $ZEILE"
done < /etc/passwd
Ausgabe (gekürzt): Zeile: root:x:0:0:root:/root:/bin/bash Zeile: daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin Zeile: bin:x:2:2:bin:/bin:/usr/sbin/nologin
- Das Umleitungszeichen < sorgt dafür, dass die Datei als Eingabequelle (STDIN) verwendet wird.*
- Jede Zeile wird nacheinander in die Variable ZEILE gelesen.*
Beispiel – Mit Exit-Status prüfen
- Die Bedingung in der while-Schleife basiert auf dem Rückgabewert eines Befehls (0 = wahr, ≠0 = falsch).*
- Dies kann auch mit echo $? überprüft werden.*
ping -c1 10.0.0.1 > /dev/null 2>&1
echo $?
0
while ping -c1 10.0.0.1 > /dev/null 2>&1
do
echo "Host erreichbar"
sleep 5
done
Hinweise
- Die Schleife wird beendet, sobald die Bedingung falsch ist (Exit-Code ≠ 0).
- Eine Endlosschleife kann mit while true; do … done erstellt werden.
- Mit break kann die Schleife vorzeitig verlassen werden.
- Mit continue wird der aktuelle Durchlauf übersprungen.
- Der aktuelle Exit-Status kann jederzeit mit echo $? angezeigt werden.
Aufgaben
- Erstellen Sie eine while-Schleife, die von 1 bis 10 zählt und jede Zahl ausgibt.
- Schreiben Sie ein Skript, das alle Zeilen einer Datei /etc/passwd einliest und nur die ersten fünf Zeilen ausgibt.
- Erstellen Sie eine Endlosschleife, die alle 3 Sekunden prüft, ob eine Datei /tmp/testfile existiert, und beendet sich, wenn sie gefunden wird.
- Erweitern Sie das Skript um die Ausgabe des Rückgabewerts mit echo $? nach jeder Prüfung.