Я помітив, є два альтернативних способи побудови циклів в zsh :
for x (1 2 3); do echo $x; done
for x in 1 2 3; do echo $x; done
Вони обидва друкують:
1
2
3
Моє запитання: чому два синтаксиси? Чи є $x
ітерація через різний тип об'єкта в кожному з них?
Чи робить Баш подібну відмінність?
Додаток:
Чому працює наступне?
#!/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
буде працювати, і він відповідатиме першому синтаксису, який ви перерахували на початку запитання.