Est pour ((…)) {…;} une syntaxe shell valide? Dans quels coquillages?

21

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 ...; donedans le manuel.

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

Isaac
la source

Réponses:

30

{ ...; }a déjà été accepté à la place do ...; doneen forboucles dans la première version du shell Bourne dans Unix V7 à la fin des années 70 (voir le code source ) mais jamais documenté autant que je sache.

Tous ksh(à la fois l'original dérivé du shell Bourne et la réécriture ksh93), pdksh¹ (et dérivés), bash(depuis le début en 1989) et le zshsoutiennent. Je ne connais aucun ashdérivé qui le fasse. yashnon plus, mais a yashété écrit au 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 ses variantes). Et il est documenté là - bas et a été depuis son introduction .

AFAIK, à côté zsh, seul pdksh le documente (pour les deux foret select).

Quant au ((init; condition; action))formulaire, il provient de ksh93et a été copié par zshet bash.

Ni cela ((...))ni la { ...; }place de ne do ...; donesont POSIX.

Voir aussi À quoi sert le mot-clé "do" dans Bash pour les boucles? pour plus de forformes de boucle.


¹ pas les versions antérieures, ni le shell Forsyth 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é

Stéphane Chazelas
la source
1
Wow, M. Bourne a pleinement adopté l'utilisation du préprocesseur c dans ce code source des années 70.
Digital Trauma