J'ai remarqué qu'il existe deux manières de créer des boucles en zsh :
for x (1 2 3); do echo $x; done
for x in 1 2 3; do echo $x; done
Ils ont tous deux imprimer:
1
2
3
Ma question est, pourquoi les deux syntaxes? Est-ce que $x
itérer à travers un type d'objet différent dans chacun d'eux?
Est -ce que bash faire une distinction similaire?
Addenda:
Pourquoi fonctionne ce qui suit ?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
for x in $d; do print $x;done
mais celui-ci ne le fait pas ?:
#!/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}
. Les points-virgules s'appliquent à la boucle la plus externe et les redirections, à la partie la plus intérieure. Si vous devez modifier cela, vous n'avez besoin que d'accolades: for i ({0..4..2}) { for j ({a..c}) echo "($i,$j)" } | cat -n
= {1,...,9}*({0,2,4}x{a,b,c})
. Bien sûr, vous pouvez combiner des boucles avec une extension zsh:for i ("("{0..4..2}","{a..c}")") echo $i
for x ($d); do print $x; done
Cela fonctionnera et correspondra à la première syntaxe que vous avez énumérée au début de votre question.