While: Unterschied zwischen den Versionen

Aus Xinux Wiki
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…“
 
 
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
= while-Schleifen =
== while-Schleifen ==


*Die while-Schleife in der Bash führt Befehle so lange aus, wie eine bestimmte Bedingung erfüllt ist.*
*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.*
*Sie ist ideal, wenn die Anzahl der Wiederholungen im Voraus nicht bekannt ist – z. B. beim Einlesen von Daten oder bei Wartebedingungen.


== 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 ==
while [ Bedingung ]; do
<syntaxhighlight lang="bash">
  Befehle
while [ Bedingung ]
done
do
  Befehle
done
</syntaxhighlight>


== Beispiel – Zählerschleife ==
== Beispiel – Zählerschleife ==
*Ein einfaches Beispiel mit einer Zählvariablen.*
*Ein einfaches Beispiel mit einer Zählvariablen.


ZAHL=1
<syntaxhighlight lang="bash">
while [ $ZAHL -le 5 ]; do
ZAHL=1
  echo "Zahl: $ZAHL"
while [ $ZAHL -le 5 ]
  ZAHL=$((ZAHL+1))
do
done
  echo "Zahl: $ZAHL"
  ZAHL=$((ZAHL+1))
done
</syntaxhighlight>


  Ausgabe:
  Ausgabe:
Zeile 31: Zeile 37:


== Beispiel – Wartebedingung ==
== Beispiel – Wartebedingung ==
*Solange eine Datei nicht existiert, wartet die Schleife.*
*Solange eine Datei nicht existiert, wartet die Schleife.


while [ ! -f /tmp/start.flag ]; do
<syntaxhighlight lang="bash">
  echo "Warte auf Startdatei..."
while [ ! -f /tmp/start.flag ]
  sleep 2
do
done
  echo "Warte auf Startdatei..."
echo "Datei gefunden, starte Vorgang."
  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.


while read ZEILE; do
<syntaxhighlight lang="bash">
  echo "Zeile: $ZEILE"
while read ZEILE
done < /etc/passwd
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 "<" sorgt dafür, dass die Datei als Eingabequelle (STDIN) verwendet wird.*
*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 "echo $?" überprüft werden.*
*Dies kann auch mit '''echo $?''' überprüft werden.


ping -c1 10.0.0.1 > /dev/null 2>&1
<syntaxhighlight lang="bash">
echo $?
ping -c1 10.0.0.1 > /dev/null 2>&1
0
echo $?
0


while ping -c1 10.0.0.1 > /dev/null 2>&1; do
while ping -c1 10.0.0.1 > /dev/null 2>&1
  echo "Host erreichbar"
do
  sleep 5
  echo "Host erreichbar"
done
  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 "while true; do … done" erstellt werden.
* Eine Endlosschleife kann mit '''while true; do … done''' erstellt werden.
* Mit "break" kann die Schleife vorzeitig verlassen werden.
* Mit '''break''' kann die Schleife vorzeitig verlassen werden.
* Mit "continue" wird der aktuelle Durchlauf übersprungen.
* Mit '''continue''' wird der aktuelle Durchlauf übersprungen.
* Der aktuelle Exit-Status kann jederzeit mit '''echo $?''' angezeigt werden.


== Aufgaben ==
= Aufgaben zu while-Schleifen =
* 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.
== Zähler mit Bedingung aus externer Quelle ==
* Erstellen Sie eine Endlosschleife, die alle 3 Sekunden prüft, ob eine Datei "/tmp/testfile" existiert, und beendet sich, wenn sie gefunden wird.
*Erstellen Sie eine while-Schleife, die so lange zählt, wie der Inhalt der Datei /tmp/limit eine Zahl größer als 0 enthält. Verringern Sie in jedem Durchlauf den Wert in der Datei um 1.
* Erweitern Sie das Skript um die Ausgabe des Rückgabewerts ("echo $?") nach jeder Prüfung.
 
== Prozessüberwachung ==
*Schreiben Sie eine Schleife, die alle 2 Sekunden prüft, ob der Prozess sshd läuft. Wenn er startet, soll die Schleife sofort abbrechen und „Prozess gefunden“ ausgeben.
 
== Lesen mit Filter ==
*Lesen Sie /etc/passwd zeilenweise ein, aber geben Sie nur Zeilen aus, die das Wort /bin/bash enthalten.
 
== Zeitbegrenzte Schleife ==
*Erstellen Sie eine Schleife, die maximal 10 Durchläufe macht. In jedem Durchlauf prüfen Sie, ob /tmp/ready existiert. Wenn die Datei gefunden wird, brechen Sie sofort ab. Wenn sie nach 10 Durchläufen nicht gefunden wird, geben Sie „Timeout“ aus.
 
== Echtzeit-Einlesung ==
*Erstellen Sie eine Schleife, die Eingaben des Benutzers (read) entgegennimmt und jede Eingabe sofort wieder ausgibt. Wenn der Benutzer „stop“ eingibt, soll die Schleife enden.
 
== Schleife gesteuert über Exit-Status ==
*Führen Sie ein Kommando in der Schleife aus (z. B. curl -Is https://example.com). Die Schleife soll so lange laufen, wie der Exit-Status ungleich 0 ist. Bei Erfolg soll „Erreichbar“ ausgegeben werden.

Aktuelle Version vom 25. November 2025, 15:38 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 zu while-Schleifen

Zähler mit Bedingung aus externer Quelle

  • Erstellen Sie eine while-Schleife, die so lange zählt, wie der Inhalt der Datei /tmp/limit eine Zahl größer als 0 enthält. Verringern Sie in jedem Durchlauf den Wert in der Datei um 1.

Prozessüberwachung

  • Schreiben Sie eine Schleife, die alle 2 Sekunden prüft, ob der Prozess sshd läuft. Wenn er startet, soll die Schleife sofort abbrechen und „Prozess gefunden“ ausgeben.

Lesen mit Filter

  • Lesen Sie /etc/passwd zeilenweise ein, aber geben Sie nur Zeilen aus, die das Wort /bin/bash enthalten.

Zeitbegrenzte Schleife

  • Erstellen Sie eine Schleife, die maximal 10 Durchläufe macht. In jedem Durchlauf prüfen Sie, ob /tmp/ready existiert. Wenn die Datei gefunden wird, brechen Sie sofort ab. Wenn sie nach 10 Durchläufen nicht gefunden wird, geben Sie „Timeout“ aus.

Echtzeit-Einlesung

  • Erstellen Sie eine Schleife, die Eingaben des Benutzers (read) entgegennimmt und jede Eingabe sofort wieder ausgibt. Wenn der Benutzer „stop“ eingibt, soll die Schleife enden.

Schleife gesteuert über Exit-Status

  • Führen Sie ein Kommando in der Schleife aus (z. B. curl -Is https://example.com). Die Schleife soll so lange laufen, wie der Exit-Status ungleich 0 ist. Bei Erfolg soll „Erreichbar“ ausgegeben werden.