Ist für ((…)) {…;} eine gültige Shell-Syntax? In welchen Muscheln?

21

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 ...; doneim Handbuch finden.

Gibt es eine Referenz im Handbuch? Für welche Shells funktioniert das richtig?

Isaac
quelle
2
Verwandte Themen: Wozu dient das Schlüsselwort "do" in Bash for loops?
Stéphane Chazelas

Antworten:

30

{ ...; }wurde bereits in der ersten Version der Bourne-Shell in Unix V7 in den späten 70er Jahren anstelle von do ...; donein- forSchleifen 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) und zshunterstützen es. Ich kenne kein ashDerivat, das das tut. yashtut es auch nicht, yashwurde aber nach dem POSIX-Standard geschrieben.

In zshwurde 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 nur for i in 1 2; { ...; }, es ist for i in 1 2; any-command(und Varianten davon). Und es ist dokumentiert dort und hat sich seit seiner Einführung gewesen .

AFAIK zshdokumentiert es außerdem nur pdksh (für beide forund select).

Das ((init; condition; action))Formular stammt von ksh93und wurde von zshund kopiert bash.

Weder das ((...))noch das { ...; }anstelle von do ...; donePOSIX sind.

Siehe auch Wozu dient das Schlüsselwort "do" in Bash for loops? für mehr forSchleifenformen.


¹ 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

Stéphane Chazelas
quelle
1
Wow, Mr. Bourne hat die Verwendung des c-Präprozessors in diesem 70er-Jahre-Quellcode voll und ganz begrüßt.
Digitales Trauma