zsh 和 bash 中的 for 循环

Ame*_*ina 83 bash zsh

我注意到在zsh 中有两种构建循环的替代方法:

  1. for x (1 2 3); do echo $x; done
  2. for x in 1 2 3; do echo $x; done

他们都打印:

1
2
3
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么是这两种语法?是否在每个对象$x迭代不同类型的对象

bash是否有类似的区别?

附录:

为什么以下工作?:

#!/bin/zsh
a=1
b=2
c=5    

d=(a b c)    
for x in $d; do print $x;done
Run Code Online (Sandbox Code Playgroud)

但这个没有?:

#!/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 
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 88

多种形式的复杂命令(例如循环)在 zsh 中具有替代形式。这些形式主要受C shell 的启发,这在 zsh 年轻时相当普遍,但现在已经消失了。这些替代形式的行为与正常形式完全相同,只是语法不同。它们略短,但不太清楚。

为标准形式for的命令是for x in 1 2 3; do echo $x; done,和用于标准形式while的命令是while test …; do somecommand; done。KSH,bash和zsh中具有的另一种形式forfor ((i = 0; i < 42; i++)); do somecommand; done中,其中模拟物for的像C或Pascal语言环路,枚举整数。zsh 中存在的其他奇异形式是 zsh 特有的(但通常受到 csh 的启发)。

  • @intrpc 查看我更新的答案。至于你的最后一个例子,它不起作用,因为你写了 `for x $d` 而 zsh 需要 `in` 或 `(` 你写 `$d` 的地方。标点符号和保留字不能来自变量扩展,它们必须在 shell 开始变量扩展之前被解析。 (3认同)
  • @alpha_989 在类似 sh 的语法中,你需要在 `));` 之后加上 `do`。Zsh 还接受另一种语法 `for ((...)); COMMAND`,其中`COMMAND` 是单个命令。这就是为什么它接受`for ((i = 1; i&lt;100; i++)); ghi 显示 $i | grep“日志”`。当它在此之后看到 `done` 时,它会抱怨因为没有 `do` 可以结束。请参阅[手册中的“复杂命令的替代形式”](http://zsh.sourceforge.net/Doc/Release/Shell-Grammar.html#Alternate-Forms-For-Complex-Commands)。 (2认同)