Qual è lo scopo della parola chiave "do" in Bash per i loop?


76

Qual è lo scopo della doparola chiave nella forsintassi del loop Bash ? Per me, sembra ridondante.

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

Perché la sintassi non è così?

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

Sono sicuro che non riempie uno scopo. Voglio solo imparare.

Risposte:


118

Si noti che tale sintassi è ereditata dalla shell Bourne.

Dopo il nome della variabile, è possibile disporre indell'elenco di elementi esplicitamente fornito oppure dodi passare in rassegna i parametri posizionali.

for i in 1 2 3
do
  echo "$i"
done

O

set 1 2 3
for i do
  echo "$i"
done

Avere doin entrambi i casi (anche se non è strettamente necessario nel primo) rende la sintassi più coerente. È anche coerente con i while/ untilloop dove doè necessario.

while
  cmd1
  cmd2
do
  cmd3
  cmd4
done

Hai bisogno dodi dire dove finisce l'elenco dei comandi di condizione .

Si noti che la shell Bourne non supportava for i; do. Anche quella sintassi non era POSIX fino all'edizione 2016 dello standard ( for i doè sempre stata POSIX; vedere il relativo bug del gruppo Austin ).

zsh ha alcune forme abbreviate come:

for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i

O supporto per più di una variabile:

for i j (1 a 2 b) echo $i $j

(sebbene non sia possibile utilizzare ino docome nome di variabile al posto di jsopra).

Anche se raramente documentate, la maggior parte delle shell simili a Bourne (Bourne, ksh, bash, zsh, non ashyash) supportano anche:

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

La shell Bourne kshe zsh(ma non bash) supporta anche:

for i { echo "$i"; }

Mentre bash, kshe zsh(ma non la shell Bourne) Supporto:

for i; { echo "$i"; }

Tutti (Bourne, bash, ksh, zsh) Supporto:

for i
{ echo "$i";}

ksh93, bash, zshSupporto:

for ((i=1;i<=3;i++)) { echo "$i"; }

2
Come sempre, risposta completa e perfetta (con riferimento a zsh) ...
Kiwy,

2
Non è "strettamente necessario" in entrambi i casi per for; il comando potrebbe essere terminato da una nuova riga o punto e virgola. Ha un po 'più senso per if/ while(il primo con thenpiuttosto che do), ma in linea di principio quelli avrebbero potuto ometterlo e richiedere una sottostruttura o parentesi graffe per l'uso (raro) di più comandi. Sospetto che la vera ragione per cui la shell Bourne lo faccia sia perché ALGOL lo fa, e dovremmo essere contenti che donenon sia scritto od.
Casuale 832

4
@ Random832: Questo perché odera già stato usato come nome del programma Dump ottale.
user1024

8
C'è così tanto qui che non sapevo. Grazie!
Corse di leggerezza con Monica il

1
@mirabilos, for i doè Bourne e POSIX, ma non funzionerà in alcune vecchie versioni di shell IIRC a base di cenere. for i in "$@"non funzionerà nella shell Bourne se $IFSnon contiene il carattere spazio. for i<newline>doè davvero il più portatile se è necessario considerare sistemi BSD molto vecchi. Vedi in-ulm.de/~mascheck/various/bourne_args per i dettagli
Stéphane Chazelas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.