for-Schleife

Eine for-Schleife unterscheidet sich von ähnlichen Schleifen in anderen Sprachen dadurch, daß sie nicht Anfangs- und Endwerte von Schleifenzählern beziehungsweise irgendwelche Abbruchbedingungen bekommt, und dann die Zwischenwerte selbst berechnet, sondern vielmehr muß man ihr alle Werte geben, für die die Schleife ausgeführt werden soll. Also nicht für Werte von i von 1 bis 5 in Einserschritten, sondern stattdessen für die Werte ("1", "2", "3", "4", und "5").

Dabei sind die angegebenen Werte in Wirklichkeit wieder gar keine Zahlen, sondern nur Strings.

Damit ist die for-Schleife keine Zählschleife, wie man vielleicht erwartet hätte, sondern eine Schleife über eine Liste von Strings.

Eine reine Zählschleife kann man dagegen mit while (siehe while-Schleife) und beispielsweise expr (Numerik light mit expr) bauen.



Die Struktur einer solchen Schleife sieht so aus:
for name in ersterwert zweiterwert dritterwert...
do
# Verwenden von $name
# Beim 1. Durchlauf hat $name den Wert "ersterwert",
# beim 2. Durchlauf hat $name den Wert "zweiterwert", ...
done

Beispiel 13   Anzeige von 4 Dateinamen, und Löschen dieser Dateien:
for f in a.f77 b.cpp a.o b.cpp
do
echo Ich lösche die Datei $f
rm $f
done



Man kann eine for-Schleife auch einzeilig schreiben. Das ist besonders dann interessant, wenn man nicht in einem Skript arbeitet, sondern die Schleife interaktiv eingibt. Die obige Schleife würde so aussehen:
for f in a.f77 b.cpp a.o b.cpp; do echo Ich lösche die Datei $f; rm $f; done
Man muß dabei allerdings an einigen Stellen mit einem Semikolon (;) der Shell einen Hinweis geben, wo die Liste der Schleifenwerte beziehungsweise die Liste der Argumente eines Kommandos endet.



Wenn man das Schlüsselwort in und die Liste der Schleifenwerte wegläßt, dann läuft die Schleife über alle Werte in $* (siehe Vordefinierte und spezielle Variablen, shift, set).

Die Schleife:
for name
do
# Verwenden von $name
done
ist also identisch mit dieser Version:
for name in $*
do
# Verwenden von $name
done



Bevor die Schleife ausgeführt wird, wird in der Liste der Schleifenwerte eine Dateinamenexpansion durchgeführt. Dies ist sehr praktisch, wenn man eine Schleife über bestimmte Dateien laufen lassen will.

Beispiel 14   Löschen aller Dateien mit der Endung .bak im aktuellen Verzeichnis:
for f in *.bak
do
rm $f
done

Wenn man jetzt nicht nur die Dateien eines Verzeichnisses anfassen will, sondern auch in allen Unterverzeichnissen, dann muß dafür wie immer find herhalten.

Beispiel 15   Löschen aller Dateien mit der Endung .bak im aktuellen Verzeichnis und allen darunter liegenden Verzeichnissen:
for f in `find ~/aweho000411 -name "*.bak"`;
do
rm $f
done

AnyWare@Wachtler.de