Qual é o propósito da palavra-chave "do" no Bash para loops?

70

Qual é o objetivo da palavra-chave do na sintaxe do loop Bash for ? Para mim, parece redundante.

for i in 'seq 1 2'; do echo "hi"; done

Por que a sintaxe não é assim?

for i in 'seq 1 2'; echo "hi"; done

Tenho certeza de que faz preencher um propósito. Eu só quero aprender.

    
por Fredrik Johansson 31.08.2016 / 12:42

1 resposta

112

Observe que essa sintaxe é herdada do shell Bourne.

Após o nome da variável, você pode ter in para ter a lista de elementos explicitamente fornecida, ou do , para percorrer 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 o do em ambos os casos (mesmo que não seja estritamente necessário no primeiro) torna a sintaxe mais consistente. Também é consistente com os% while / until loops onde o do é necessário.

while
  cmd1
  cmd2
do
  cmd3
  cmd4
done

Você precisa do do para informar onde a lista de comandos condição termina.

Observe que o shell Bourne não oferece suporte a for i; do . Essa sintaxe também não era POSIX até a edição 2016 do padrão ( for i do sempre foi POSIX; veja o bug relacionado do grupo Austin ).

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 in ou do como nome da variável no lugar de j acima).

Mesmo que raramente documentados, a maioria dos shells semelhantes a Bourne (Bourne, ksh, bash, zsh, não ash nem yash ) também suportam:

for i in 1 2 3; { echo "$i";}

O shell Bourne, ksh e zsh (mas não bash ) também suporta:

for i { echo "$i"; }

Embora o suporte bash , ksh e zsh (mas não o shell Bourne) suporte:

for i; { echo "$i"; }

Suporte a todos (Bourne, bash , ksh , zsh ):

for i
{ echo "$i";}

ksh93 , bash , zsh support:

for ((i=1;i<=3;i++)) { echo "$i"; }
    
por 31.08.2016 / 12:58

Tags