Qual è lo scopo di do
parola chiave in Bash for
sintassi del ciclo? 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 lo fa riempire uno scopo. Voglio solo imparare.
Risposta accettata:
Nota che quella sintassi è ereditata dalla shell Bourne.
Dopo il nome della variabile, puoi avere sia in
per avere l'elenco di elementi fornito in modo esplicito, o do
, per scorrere i parametri posizionali.
for i in 1 2 3
do
echo "$i"
done
Oppure
set 1 2 3
for i do
echo "$i"
done
Avere il do
in entrambi i casi (anche se nel primo non è strettamente necessario) rende più coerente la sintassi. È anche coerente con il while
/until
loop in cui do
è necessario.
while
cmd1
cmd2
do
cmd3
cmd4
done
Hai bisogno di do
per dire dove si trova l'elenco delle condizioni i comandi finiscono.
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 stato 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
(anche se non puoi usare in
o do
come nome della variabile al posto di j
sopra).
Anche se raramente documentate, la maggior parte delle shell simili a Bourne (Bourne, ksh, bash, zsh, non ash
né yash
) supportano anche:
for i in 1 2 3; { echo "$i";}
La shell Bourne, ksh
e zsh
(ma non bash
) supportano anche:
for i { echo "$i"; }
Mentre bash
, ksh
e zsh
(ma non la shell Bourne) supporto:
for i; { echo "$i"; }
Tutti (Bourne, bash
, ksh
, zsh
) supporto:
for i
{ echo "$i";}
ksh93
, bash
, zsh
supporto:
for ((i=1;i<=3;i++)) { echo "$i"; }