Zum Inhalt springen

Bash/Schleifen

Aus Foxwiki
Version vom 14. Oktober 2025, 10:16 Uhr von Dirkwagner (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „== Schleifen == ; for-Anweisung Diese Schleifenanweisung hat zwei Ausprägungen * mit einer Liste der zu bearbeitenden Elemente * mit den Kommandozeilenparametern Dieses Konstrukt ähnelt nur auf den ersten Blick seinen Pendants aus anderen Programmiersprachen * In anderen Sprachen wird die for-Schleife meistens dazu benutzt, eine Zählvariable über einen bestimmten Wertebereich iterieren zu lassen (for i = 1 to 100...next) * In der Shell dagegen wird d…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Schleifen

for-Anweisung

Diese Schleifenanweisung hat zwei Ausprägungen

  • mit einer Liste der zu bearbeitenden Elemente
  • mit den Kommandozeilenparametern

Dieses Konstrukt ähnelt nur auf den ersten Blick seinen Pendants aus anderen Programmiersprachen

  • In anderen Sprachen wird die for-Schleife meistens dazu benutzt, eine Zählvariable über einen bestimmten Wertebereich iterieren zu lassen (for i = 1 to 100...next)
  • In der Shell dagegen wird die Laufvariable nicht mit aufeinander folgenden Zahlen belegt, sondern mit einzelnen Werten aus einer anzugebenden Liste
  • Wenn man eine Laufvariable benötigt, muss man dazu die while-Schleife einsetzen

Die Syntax der for-Schleife lautet wie folgt

for x [ in Liste ]
do

Befehle

done

Die Befehle werden ausgeführt, wobei der Variablen x nacheinander die Werte aus der Liste zugewiesen werden

  • Wie man sieht, ist die Angabe der Liste optional, wenn sie nicht angegeben wird, nimmt x der Reihe nach alle Werte aus@ (in dieser vordefinierten Variablen liegen die Aufrufparameter) an
  • Wenn die Ausführung eines Schleifendurchlaufs bzw. der ganzen Schleife abgebrochen werden soll, müssen die Kommandos continue bzw. break benutzt werden

for-Schleife mit Liste

for selector in liste
do
Kommandofolge
done

Die Selektor-Variable wird nacheinander durch die Elemente der Liste ersetzt und die Schleife mit der Selektor-Variablen ausgeführt

Beispiele
for X in hans heinz karl luise do echo X done

Ausgabe

hans
heinz
karl
luise
for FILE in *.txt # drucke alle Textdateien
do # im aktuellen Verzeichnis
lpr FILE
done
for XX in VAR # geht auch mit
do
echo XX
done

Durchsuche Kapitel zur Erstellung einer Wortliste (wie fgrep -f)

for item in (cat program_list) # cat: Datei ausgeben
do
echo "Pruefung der Kapitel auf"
echo "Referenzen zum Programmitem ..."
grep -c "$item.[co]" chap* # grep: nach Muster suchen
done

for-Schleife mit Parametern

for selector
do
Kommandofolge
done

Die Selektor-Variable wird nacheinander durch die Parameter1 bisn ersetzt und mit diesen Werten die Schleife durchlaufen. Es gibt also# Schleifendurchläufe

Beispiel

Die Prozedur 'makebak' erzeugt für die in der Parameterliste angegebenen Dateien eine .bak-Datei

for FF
do
cpFF{FF}.bak
done
#!/bin/sh
# Seitenweises Formatieren der Dateien, die auf der
# Befehlszeile angegeben wurden, und speichern des
# jeweiligen Ergebnisses

for file do
prfile >file.tmp # pr: Formatiert Textdateien
done
# Ermittle einen Ein-Wort-Titel aus jeder Datei und
# verwende ihn als neuen Dateinamen

for file do
name=`sed -n 's/NAME: //p'file`
# sed: Skriptsprache zur Textformatierung
mvfilename
# mv: Datei verschieben bzw. umbenennen
done

while

Die while-Schleife ist wieder ein Konstrukt, das einem aus vielen anderen Sprachen bekannt ist

Die kopfgesteuerte Schleife. Die Syntax der while-Schleife lautet wie folgt

while Bedingung
do

Befehle
done

Die Befehle werden so lange ausgeführt, wie die Bedingung erfüllt ist

Dabei wird die Bedingung vor der Ausführung der Befehle überprüft. Die Bedingung wird dabei üblicherweise, genau wie bei der if-Anweisung, mit dem Befehl test formuliert

Wenn die Ausführung eines Schleifendurchlaufs bzw. der ganzen Schleife abgebrochen werden soll, müssen die Kommandos continue bzw. break benutzt werden

Beispiele
#!/bin/sh
# Zeilenweise Ausgabe aller Aufrufparameter

while [ -n "$1"]; do

echo 1
shift # mit shift werden die Parameter nach
# Links geshiftet (aus2 wird1)
done


Zählschleife

In anderen Sprachen kann man mit der for-Schleife eine Zählvariable über einen bestimmten Wertebereich iterieren lassen (for i = 1 to 100...next)

Da das mit der for-Schleife der Shell nicht geht, ersetzt man die Funktion durch geschickte Anwendung der while-Schleife

#!/bin/sh
# Ausgabe der Zahlen von 1 bis 100
i=1
while [ i -le 100 ]
do
echoi
i=`expri + 1`
done
Weitere Beispiele
#!/bin/sh

while who | grep "^root "
do sleep 30

done

echo Die Katze ist aus dem Haus, Zeit, dass die Mäuse tanzen!
Ergebniswert eines Kommandos

Als Bedingung kann nicht nur eine "klassische" Bedingung (test oder [ ]) sondern auch der Ergebniswert eines Kommandos oder einer Kommandofolge verwendet werden

while Bedingung
do
Kommandofolge
done

Solange der Bedingungsausdruck den Wert 'true' liefert, wird die Schleife ausgeführt

Warten auf eine Datei (beispielsweise vom Hintergrundprozess)
while [ ! -f foo ]
do
sleep 10 # Wichtig damit die Prozesslast nicht zu hoch wird
done

; Pausenfüller für das Terminal Abbruch mit DEL-Taste
while 
do
tput clear # BS löschen
echo -e "\n\n\n\n\n" # 5 Leerzeilen
banner(date '+ %T ') # Uhrzeit groß
sleep 10 # 10s Pause
done
Umbenennen von Dateien durch Anhängen eines Suffix
# Aufruf change suffix datei(en)
if [# -lt 2 ] ; then
echo "Usage: `basename0` suffix file(s)"
else
SUFF=$1 # Suffix speichern
shift
while [# -ne 0 ] # solange Parameter da sind
do
mv1{1}.$SUFF # umbenennen
shift
done
fi
Umbenennen von Dateien durch Anhängen eines Suffix Variante 2 mit for
# Aufruf change suffix datei(en)
if [# -lt 2 ] ; then
echo "Usage: `basename0` suffix file(s)"
else
SUFF=$1 # Suffix speichern
shift
for FILE
do
mvFILE{FILE}.$SUFF # umbenennen
shift
done
fi

until

Diese Anweisung ist identisch zu einer while-Schleife mit negierter Bedingung

Als Bedingung kann nicht nur eine "klassische" Bedingung (test oder [ ]) sondern auch der Ergebniswert eines Kommandos oder einer Kommandofolge verwendet werden

until Bedingung
do
Kommandofolge
done

Die Schleife wird so lange abgearbeitet, bis Bedingungsausdruck einen Wert ungleich Null liefert

Beispiel
# warten auf Datei foo
until [ -f foo ]
do
sleep 10
done
Warten auf einen Benutzer
# warten, bis sich der Benutzer hans eingeloggt hat
TT=`who | grep -c "hans"`
until [TT -gt 0 ]
do
sleep 10
TT=`who | grep -c "hans"`
done
# warten, bis sich der Benutzer hans eingeloggt hat
# Variante 2 - kuerzer
until [ `who | grep -c "hans"` -gt 0 ]
do
sleep 10
done

Die Befehle werden ausgeführt, bis die Bedingung erfüllt ist. Die Bedingung wird dabei üblicherweise, genau wie bei der if-Anweisung, mit dem Befehl test formuliert

Wenn die Ausführung eines Schleifendurchlaufs bzw. der ganzen Schleife abgebrochen werden soll, müssen die Kommandos continue bzw. break benutzt werden

Beispiel

Hier wird die Bedingung nicht per test, sondern mit dem Rückgabewert des Programms grep formuliert

#!/bin/sh
# Warten, bis sich der Administrator einloggt

until who | grep "root"; do
# who: Liste der Benutzer
# grep: Suchen nach Muster
sleep 30 # sleep: warten
done
echo "Der Meister ist anwesend"