我注意到有两种在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
真是太疯狂了 -那两个声明-确实都不能“相同地工作”。我真的无法解决这个问题!我需要抽烟那些贝壳设计者正在抽烟的东西,回想起来,哈哈。
—
亚历克斯·格雷2014年
小心一点,这个故事比最初出现的更多。我邀请您检查我的答案。
—
jasonleonhard
我没有看到其他人提及它,但是两种形式都允许省略do / done:
—
John P
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
将起作用,并且将与您在问题开始时列举的第一个语法匹配。