ImH*_*ere 21 shell bash ksh zsh
表达式:
$ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}'
0
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
工作正常。
我没有在手册中找到{...;}替换 的语法的描述; do ...; done。
手册上有参考吗?对于哪些外壳可以正常工作?
Sté*_*las 30
{ ...; }在 70 年代后期,Unix V7 中的 Bourne shell 的第一个版本中已经接受了do ...; doneinfor循环(请参阅源代码),尽管据我所知从未记录在案。
所有ksh(从 Bourne shell 派生的原始 shell 和 ksh93 重写)、pdksh¹(和派生类)bash(从 1989 年开始)并zsh支持它。我不知道有任何ash衍生物可以这样做。yash也不是,而是yash写入了 POSIX 标准。
在 中zsh,1991 年在 2.0 中添加了支持,但作为大多数结构的新短格式范围的一部分,超出了 Bourne 语法。它不仅for i in 1 2; { ...; },它for i in 1 2; any-command(及其变体)。它被记录在那里,并且自其推出以来一直存在。
AFAIK,除此之外zsh,只有 pdksh 记录它(对于for和select)。
至于((init; condition; action))形式,即来自ksh93与被复制zsh和bash。
that((...))和{ ...; }in place ofdo ...; done都不是 POSIX。
另请参阅Bash for 循环中“do”关键字的用途是什么?更多for循环形式。
¹ 不是早期版本,也不是它所基于的 Forsyth shell。它于 1994 年在 5.1.1 中添加,这可能解释了为什么它被记录在那里