Observe que essa sintaxe é herdada do shell Bourne.
Após o nome da variável, você pode ter ina lista de elementos fornecida explicitamente ou dofazer um loop sobre os parâmetros posicionais.
for i in 1 2 3
do
echo "$i"
done
Ou
set 1 2 3
for i do
echo "$i"
done
Ter os dodois casos (mesmo que não seja estritamente necessário no primeiro) cria uma sintaxe mais consistente. Também é consistente com os loops while/ untilonde doé necessário.
while
cmd1
cmd2
do
cmd3
cmd4
done
Você precisa dodizer onde termina a lista de comandos de condição .
Observe que o shell Bourne não suportava for i; do. Essa sintaxe também não foi POSIX até a edição de 2016 do padrão ( for i dosempre foi POSIX; veja o bug do grupo Austin relacionado ).
zsh tem algumas formas abreviadas como:
for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i
Ou suporte para mais de uma variável:
for i j (1 a 2 b) echo $i $j
(embora você não possa usar inou docomo nome da variável no lugar jacima).
Mesmo raramente documentado, a maioria dos shells tipo Bourne (Bourne, ksh, bash, zsh, not ashnem yash) também suporta:
for i in 1 2 3; { echo "$i";}
O shell Bourne kshe zsh(mas não bash) também suportam:
for i { echo "$i"; }
Enquanto bash, kshe zsh(mas não o shell Bourne), suporte:
for i; { echo "$i"; }
Todos (Bourne, bash, ksh, zsh) apoio:
for i
{ echo "$i";}
ksh93, bash, zshApoio:
for ((i=1;i<=3;i++)) { echo "$i"; }