Я заметил, что есть два альтернативных способа построения циклов в zsh :
for x (1 2 3); do echo $x; done
for x in 1 2 3; do echo $x; done
Они оба печатают:
1
2
3
У меня вопрос, почему два синтаксиса? Является ли $x
итерация через другой тип объекта в каждой из них?
Делает ли Bash подобное различие?
Приложение:
Почему работает следующее:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
for x in $d; do print $x;done
а этот нет?
#!/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}
. Точки с запятой применяются к самому внешнему циклу, а перенаправления применяются к самому внутреннему циклу, и если вам нужно это изменить, вам нужны только фигурные скобки: for i ({0..4..2}) { for j ({a..c}) echo "($i,$j)" } | cat -n
= {1,...,9}*({0,2,4}x{a,b,c})
. Конечно, вы можете комбинировать циклы с расширением zsh:for i ("("{0..4..2}","{a..c}")") echo $i
for x ($d); do print $x; done
будет работать, и он будет соответствовать первому синтаксису, который вы перечислили в начале вашего вопроса.