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 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.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
Réponses:
Plusieurs formes de commandes complexes telles que les boucles ont des formes alternatives en zsh. Ces formes sont principalement inspirées par la coquille en C , qui était assez courante quand zsh était jeune mais a maintenant disparu. Ces formes alternatives fonctionnent exactement comme les formes normales, elles sont simplement une syntaxe différente. Ils sont légèrement plus courts, mais moins clairs.
Le formulaire standard pour la
for
commande estfor x in 1 2 3; do echo $x; done
, et le formulaire standard pour lawhile
commande estwhile test …; do somecommand; done
. Ksh, bash et zsh ont une autre forme defor
:for ((i = 0; i < 42; i++)); do somecommand; done
qui imite lesfor
boucles de langues comme Pascal ou C, pour énumèrent entiers. D'autres formes exotiques existant dans zsh sont spécifiques à zsh (mais sont souvent inspirées par csh).la source
zsh
? De plus, j'ai ajouté un exemple à la fin de mon PO, où je ne sais pas comment traduire les syntaxes. Si la différence ne concerne que la syntaxe, comment dois-je corriger le deuxième script de l'addenda pour le faire fonctionner?for x $d
et compte zsh soitin
ou(
où vous avez écrit$d
. Les signes de ponctuation et les mots réservés ne peuvent pas provenir d'un développement de variable, ils doivent être analysés avant que le shell puisse démarrer sur les développements de variable.for (( … ))
formulaire et utilise beaucoup de mémoire si le nombre de pixels 3 est important.do
après));
. Zsh accepte également une autre syntaxefor ((…)); COMMAND
oùCOMMAND
est une commande unique. C'est pourquoi il acceptefor ((i = 1; i<100; i++)); ghi show $i | grep "log"
. Quand il voitdone
après cela, il se plaint parce qu'il n'y avait pasdo
de fin. Voir «Autres formes de commandes complexes» dans le manuel .