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

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

表达式:

$ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}'
0
1
2
3
4

工作正常。

我在手册中找不到该语法的描述,其中 正在{...;}替换。; do ...; done

说明书上有参考吗?对于哪些 shell 可以正常工作?

答案1

{ ...; }在 70 年代末,Unix V7 中的 Bourne shell 第一个版本中已经接受了do ...; donein循环的替代(请参阅for源代码)尽管据我所知从未有过记录。

所有ksh(从 Bourne shell 派生的原始版本,以及 ksh93 重写版本),pdksh1(及其衍生版本),bash(从 1989 年开始)并zsh支持它。我不知道有任何ash衍生品可以做到这一点。yash也不是,但是yash按照 POSIX 标准编写的。

zsh1991 年 2.0 中添加了支持,但作为大多数结构的一系列新的简短形式的一部分,超出了 Bourne 语法。它不仅是for i in 1 2; { ...; },而且是for i in 1 2; any-command(及其变体)。并且有记录那里自推出以来

AFAIK,除了 之外zsh,只有 pdksh 记录了它(对于 和forselect

至于((init; condition; action))形式,来自和 并被和ksh93复制。zshbash

那个((...)){ ...; }代替都不do ...; done是 POSIX。

也可以看看Bash for 循环中“do”关键字的用途是什么?更多for循环形式。


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

相关内容