for(( ... )){ ... ;} 是一个有效的 shell 语法吗?在哪个贝壳里?

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 记录它(对于forselect)。

至于((init; condition; action))形式,即来自ksh93与被复制zshbash

that((...)){ ...; }in place ofdo ...; done都不是 POSIX。

另请参阅Bash for 循环中“do”关键字的用途是什么?更多for循环形式。


¹ 不是早期版本,也不是它所基于的 Forsyth shell。它于 1994 年在 5.1.1 中添加,这可能解释了为什么它被记录在那里