He notado que hay dos formas alternativas de construir bucles en zsh :
for x (1 2 3); do echo $x; done
for x in 1 2 3; do echo $x; done
Ambos imprimen:
1
2
3
Mi pregunta es, ¿por qué las dos sintaxis? ¿Está $x
iterando a través de un tipo diferente de objeto en cada uno de ellos?
¿ Bash hace una distinción similar?
Apéndice:
¿Por qué funciona lo siguiente ?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
for x in $d; do print $x;done
pero este 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}
. Los punto y coma se aplican al bucle más externo y las redirecciones se aplican al más interno, y si necesita cambiar eso, solo necesita llaves: for i ({0..4..2}) { for j ({a..c}) echo "($i,$j)" } | cat -n
= {1,...,9}*({0,2,4}x{a,b,c})
. Por supuesto, puede combinar bucles con expansión zsh:for i ("("{0..4..2}","{a..c}")") echo $i
for x ($d); do print $x; done
funcionará y coincidirá con la primera sintaxis que haya enumerado al comienzo de su pregunta.