Notei que existem duas maneiras alternativas de criar loops no zsh :
for x (1 2 3); do echo $x; done
for x in 1 2 3; do echo $x; done
Ambos imprimem:
1
2
3
Minha pergunta é: por que as duas sintaxes? Está $x
iterando através de um tipo diferente de objeto em cada um deles?
O bash faz uma distinção semelhante?
Termo aditivo:
Por que o seguinte funciona ?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
for x in $d; do print $x;done
mas este não ?:
#!/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á e corresponderá à primeira sintaxe que você enumerou no início da sua pergunta.for i ({0..4..2}) for j ({a..c}) echo "($i,$j)"
={0,2,4}x{a,b,c}
. Os pontos e vírgulas se aplicam ao loop mais externo e os redirecionamentos se aplicam ao mais interno, e se você precisar alterar isso, precisará apenas de chaves:for i ({0..4..2}) { for j ({a..c}) echo "($i,$j)" } | cat -n
={1,...,9}*({0,2,4}x{a,b,c})
. Claro que você pode combinar laços com a expansão zsh:for i ("("{0..4..2}","{a..c}")") echo $i
Respostas:
Várias formas de comandos complexos, como loops, têm formas alternativas no zsh. Essas formas são principalmente inspiradas no shell C , que era bastante comum quando o zsh era jovem, mas agora desapareceu. Essas formas alternativas agem exatamente como as formas normais, são apenas uma sintaxe diferente. Eles são um pouco mais curtos, mas menos claros.
O formulário padrão para o
for
comando éfor x in 1 2 3; do echo $x; done
e o formulário padrão para owhile
comando éwhile test …; do somecommand; done
. Ksh, festa e zsh tem uma forma alternativa defor
:for ((i = 0; i < 42; i++)); do somecommand; done
, que imita osfor
lacetes de linguagens como Pascal ou C, para enumerar inteiros. Outras formas exóticas que existem no zsh são específicas do zsh (mas geralmente inspiradas no csh).fonte
zsh
? Além disso, adicionei um exemplo no final do meu OP em que não consigo descobrir como traduzir entre sintaxes. Se a diferença for apenas sintaxe, como devo corrigir o segundo script no adendo para fazê-lo funcionar?for x $d
e o zsh esperain
ou(
onde você escreveu$d
. Os sinais de pontuação e as palavras reservadas não podem vir de uma expansão variável, eles precisam ser analisados antes que o shell possa iniciar nas expansões variáveis.for (( … ))
formulário e usa muita memória se 3 for grande.do
depois));
. O Zsh também aceita outra sintaxe, nafor ((…)); COMMAND
qualCOMMAND
existe um único comando. É por isso que aceitafor ((i = 1; i<100; i++)); ghi show $i | grep "log"
. Quando vêdone
depois disso, reclama porque não haviado
fim. Consulte "Formulários alternativos para comandos complexos" no manual .