É para ((…)) {…;} uma sintaxe válida do shell? Em que conchas?

21

A expressão:

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

funciona corretamente.

Falha ao encontrar a descrição dessa sintaxe na qual o {...;}está substituindo ; do ...; doneno manual.

Existe uma referência no manual? Para quais conchas isso funciona corretamente?

Isaac
fonte

Respostas:

30

{ ...; }já foi aceito no lugar de do ...; doneem forloops na primeira versão do shell Bourne em Unix V7 no final dos anos 70 (veja o código fonte ) mas nunca documentado, tanto quanto eu sei.

Todos ksh(tanto o original derivado do shell Bourne quanto o ksh93 reescrevem), pdksh¹ (e derivados), bash(desde o início em 1989) e o zshsuportam. Não conheço nenhum ashderivado que o faça. yashtambém não yashfoi gravado no padrão POSIX.

Em zsh, o suporte foi adicionado com o 2.0 em 1991, mas como parte de um novo intervalo de formas curtas para a maioria das construções, que vai além da sintaxe de Bourne. Não é apenas for i in 1 2; { ...; }, é for i in 1 2; any-command(e suas variantes). E está documentado e existe desde a sua introdução .

AFAIK, ao lado zsh, apenas o pdksh o documenta (para ambos fore select).

Quanto ao ((init; condition; action))formulário, que vem ksh93e foi copiado por zshe bash.

Nem isso ((...))nem o { ...; }lugar de do ...; donePOSIX.

Consulte também Qual é o objetivo da palavra-chave "do" no Bash para loops? para mais forformas de loop.


¹ não versões anteriores, nem o shell Forsyth no qual se baseia. Foi adicionado em 5.1.1 em 1994 e provavelmente explica por que foi documentado lá

Stéphane Chazelas
fonte
1
Uau, o Sr. Bourne adotou completamente o uso do pré-processador c no código-fonte dos anos 70.
Digital Trauma