He notado que hay dos formas alternativas de construir bucles en zsh :
for x (1 2 3); do echo $x; donefor x in 1 2 3; do echo $x; done
Ambos imprimen:
1
2
3
Mi pregunta es, ¿por qué las dos sintaxis? ¿Está $xiterando 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 x ($d); do print $x; donefuncionará y coincidirá con la primera sintaxis que haya enumerado al comienzo de su pregunta.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 $iRespuestas:
Varias formas de comandos complejos, como los bucles, tienen formas alternativas en zsh. Estas formas están inspiradas principalmente en el caparazón C , que era bastante común cuando zsh era joven pero ahora ha desaparecido. Estas formas alternativas actúan exactamente como las formas normales, son solo una sintaxis diferente. Son ligeramente más cortos, pero menos claros.
La forma estándar para el
forcomando esfor x in 1 2 3; do echo $x; done, y la forma estándar para elwhilecomando eswhile test …; do somecommand; done. Ksh, bash y zsh tienen una forma alternativa defor:,for ((i = 0; i < 42; i++)); do somecommand; doneque imita losforbucles de lenguajes como Pascal o C, para enumerar enteros. Otras formas exóticas que existen en zsh son específicas de zsh (pero a menudo están inspiradas en csh).fuente
zsh? Además, he agregado un ejemplo al final de mi OP donde no puedo encontrar la manera de traducir entre sintaxis. Si la diferencia es solo la sintaxis, ¿cómo debo arreglar el segundo script en el apéndice para que funcione?for x $dy zsh espera lo que escribióino(dónde escribió$d. Los signos de puntuación y las palabras reservadas no pueden provenir de una expansión variable, deben analizarse antes de que el shell pueda comenzar en las expansiones variables.for (( … ))formulario y usa mucha memoria si 3 es grande.dodespués));. Zsh también acepta otra sintaxisfor ((…)); COMMANDdondeCOMMANDes un solo comando. Por eso aceptafor ((i = 1; i<100; i++)); ghi show $i | grep "log". Cuando vedonedespués de esto, se queja porque no habíadofin. Consulte "Formularios alternativos para comandos complejos" en el manual .