Ho notato che ci sono due modi alternativi di costruire loop in zsh :
for x (1 2 3); do echo $x; done
for x in 1 2 3; do echo $x; done
Entrambi stampano:
1
2
3
La mia domanda è: perché le due sintassi? È $x
l'iterazione attraverso un diverso tipo di oggetto in ciascuno di essi?
Fa bash fare una simile distinzione?
Addendum:
Perché funziona quanto segue ?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
for x in $d; do print $x;done
ma questo no ?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
# It complains with "parse error near `$d'"
for x $d; do print $x;done
for i ({0..4..2}) for j ({a..c}) echo "($i,$j)"
= {0,2,4}x{a,b,c}
. I punti e virgola si applicano al ciclo più esterno e i reindirizzamenti si applicano al più interno, e se è necessario modificarlo, sono necessari solo parentesi graffe: for i ({0..4..2}) { for j ({a..c}) echo "($i,$j)" } | cat -n
= {1,...,9}*({0,2,4}x{a,b,c})
. Ovviamente puoi combinare i loop con l'espansione zsh:for i ("("{0..4..2}","{a..c}")") echo $i
for x ($d); do print $x; done
funzionerà e corrisponderà alla prima sintassi che hai elencato all'inizio della domanda.