While: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 96: Zeile 96:
 
== Prozessüberwachung ==
 
== 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.
 
*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.
 
== Netzwerk-Wartebedingung ==
 
*Erstellen Sie eine Schleife, die so lange läuft, bis die Route 0.0.0.0 in der Routingtabelle erscheint. Nutzen Sie ip route als Bedingung.
 
  
 
== Lesen mit Filter ==
 
== Lesen mit Filter ==
Zeile 105: Zeile 102:
 
== Zeitbegrenzte Schleife ==
 
== 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.
 
*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.
 
== Schleife mit break und continue ==
 
*Erstellen Sie eine while-Schleife, die eine Liste von Ports (z. B. 22 80 443 8080) nacheinander prüft. Ports unter 100 sollen übersprungen werden (continue). Sobald Port 443 erreicht ist, soll die Schleife beendet werden (break).
 
  
 
== Echtzeit-Einlesung ==
 
== Echtzeit-Einlesung ==

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.