Beachten Sie, dass diese Syntax von der Bourne-Shell geerbt wird.
Nach dem Variablennamen müssen Sie entweder in
die Liste der Elemente explizit angeben lassen oder do
die Positionsparameter durchlaufen.
for i in 1 2 3
do
echo "$i"
done
Oder
set 1 2 3
for i do
echo "$i"
done
Das Haben do
in beiden Fällen (auch wenn es in dem ersten nicht unbedingt notwendig ist) sorgt für eine konsistente Syntax. Es stimmt auch mit den while
/ until
Schleifen überein, in denen das do
notwendig ist.
while
cmd1
cmd2
do
cmd3
cmd4
done
Sie müssen do
angeben, wo die Liste der Bedingungsbefehle endet.
Beachten Sie, dass die Bourne-Shell nicht unterstützt for i; do
. Diese Syntax war auch erst in der Ausgabe 2016 des Standards for i do
POSIX (war schon immer POSIX; siehe den entsprechenden Fehler in der Austin-Gruppe ).
zsh
hat ein paar Kurzformen wie:
for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i
Oder Unterstützung für mehr als eine Variable:
for i j (1 a 2 b) echo $i $j
(obwohl Sie in
oder nicht do
als Variablennamen anstelle von j
oben verwenden können).
Obwohl selten dokumentiert, unterstützen die meisten Bourne-ähnlichen Shells (Bourne, ksh, bash, zsh, weder ash
noch yash
) auch:
for i in 1 2 3; { echo "$i";}
Die Bourne-Shell ksh
und zsh
(aber nicht bash
) auch:
for i { echo "$i"; }
Während bash
, ksh
und zsh
(aber nicht die Bourne - Shell) Unterstützung:
for i; { echo "$i"; }
All (Bourne, bash
, ksh
, zsh
) Unterstützung:
for i
{ echo "$i";}
ksh93
, bash
, zsh
Unterstützung:
for ((i=1;i<=3;i++)) { echo "$i"; }
for
; Der Befehl kann durch eine neue Zeile oder ein Semikolon beendet werden. Es ist ein bisschen sinnvoller fürif
/while
(ersterethen
eher mit alsdo
), aber im Prinzip hätten diese es weglassen und eine Unterschale oder geschweifte Klammern für die (seltene) Verwendung mehrerer Befehle benötigen können. Ich vermute, der wahre Grund, warum die Bourne-Shell dies tut, ist, dass ALGOL dies tut, und wir sollten froh sein, dassdone
das nicht geschrieben istod
.od
bereits der Name des Octal Dump-Programms verwendet wurde.for i do
ist Bourne und POSIX, funktioniert aber in einigen alten Versionen von aschebasierten IIRC-Shells nicht.for i in "$@"
funktioniert in der Bourne-Shell nicht, wenn$IFS
das Leerzeichen nicht enthalten ist.for i<newline>do
ist in der Tat am portabelsten, wenn Sie sehr alte BSD-Systeme berücksichtigen müssen. Siehe in-ulm.de/~mascheck/various/bourne_args für Details