Der Ausdruck:
$ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}'
0
1
2
3
4
funktioniert einwandfrei
Ich kann die Beschreibung dieser Syntax, in der die ersetzt {...;}
wird, nicht ; do ...; done
im Handbuch finden.
Gibt es eine Referenz im Handbuch? Für welche Shells funktioniert das richtig?
Antworten:
{ ...; }
wurde bereits in der ersten Version der Bourne-Shell in Unix V7 in den späten 70er Jahren anstelle vondo ...; done
in-for
Schleifen akzeptiert (siehe Quellcode ), wurde jedoch meines Wissens nie dokumentiert.Alles von
ksh
(sowohl das Original, das von der Bourne-Shell abgeleitet ist, als auch das Umschreiben von ksh93),pdksh
¹ (und Derivate)bash
(von Anfang 1989 an) undzsh
unterstützen es. Ich kenne keinash
Derivat, das das tut.yash
tut es auch nicht,yash
wurde aber nach dem POSIX-Standard geschrieben.In
zsh
wurde 1991 die Unterstützung mit 2.0 hinzugefügt, jedoch als Teil einer neuen Reihe von Kurzformen für die meisten Konstrukte, die über die Bourne-Syntax hinausgehen. Es ist nicht nurfor i in 1 2; { ...; }
, es istfor i in 1 2; any-command
(und Varianten davon). Und es ist dokumentiert dort und hat sich seit seiner Einführung gewesen .AFAIK
zsh
dokumentiert es außerdem nur pdksh (für beidefor
undselect
).Das
((init; condition; action))
Formular stammt vonksh93
und wurde vonzsh
und kopiertbash
.Weder das
((...))
noch das{ ...; }
anstelle vondo ...; done
POSIX sind.Siehe auch Wozu dient das Schlüsselwort "do" in Bash for loops? für mehr
for
Schleifenformen.¹ weder frühere Versionen noch die Forsyth-Shell, auf der es basiert. Es wurde 1994 in 5.1.1 hinzugefügt und erklärt wahrscheinlich, warum es dort dokumentiert wurde
quelle