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
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.
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.
for f in `find ~/aweho000411 -name "*.bak"`;
do
rm $f
done
AnyWare@Wachtler.de