web-dev-qa-db-fra.com

Est pour ((...)) {...;} une syntaxe Shell valide? Dans quels coquillages?

L'expression:

$ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}'
0
1
2
3
4

fonctionne correctement.

Je ne trouve pas la description de cette syntaxe dans laquelle le {...;} remplace le ; do ...; done dans le manuel.

Y a-t-il une référence dans le manuel? Pour quels obus cela fonctionne-t-il correctement?

21
Isaac

{ ...; } a déjà été accepté à la place de do ...; done dans for boucles dans la première version du Bourne Shell dans Unix V7 à la fin des années 70 (voir le code source ) mais jamais documenté à ma connaissance.

Tout ksh (à la fois l'original dérivé du Bourne Shell et la réécriture ksh93), pdksh¹ (et dérivés), bash (depuis le début en 1989) et zsh le supporte. Je ne connais aucun dérivé ash qui le fasse. yash non plus mais yash a été écrit dans le standard POSIX.

Dans zsh, le support a été ajouté avec 2.0 en 1991, mais dans le cadre d'une nouvelle gamme de formes courtes pour la plupart des constructions qui va au-delà de la syntaxe Bourne. Ce n'est pas seulement for i in 1 2; { ...; }, c'est for i in 1 2; any-command (et leurs variantes). Et il est documenté et a été depuis son introduction .

AFAIK, à côté de zsh, seul pdksh le documente (pour for et select).

En ce qui concerne la ((init; condition; action)) forme, qui vient de ksh93 et a été copié par zsh et bash.

Ni que ((...)) ni le { ...; } au lieu de do ...; done sont POSIX.

Voir aussi A quoi sert le mot-clé "do" dans Bash pour les boucles? pour plus de formes de boucles for.


¹ pas les versions antérieures, ni le Forsyth Shell sur lequel il est basé. Il a été ajouté en 5.1.1 en 1994 et cela explique probablement pourquoi il y a été documenté

30
Stéphane Chazelas