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 x ($d); do print $x; done
funcionará 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 $i
Respuestas:
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
for
comando esfor x in 1 2 3; do echo $x; done
, y la forma estándar para elwhile
comando eswhile test …; do somecommand; done
. Ksh, bash y zsh tienen una forma alternativa defor
:,for ((i = 0; i < 42; i++)); do somecommand; done
que imita losfor
bucles 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 $d
y zsh espera lo que escribióin
o(
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.do
después));
. Zsh también acepta otra sintaxisfor ((…)); COMMAND
dondeCOMMAND
es un solo comando. Por eso aceptafor ((i = 1; i<100; i++)); ghi show $i | grep "log"
. Cuando vedone
después de esto, se queja porque no habíado
fin. Consulte "Formularios alternativos para comandos complejos" en el manual .