表达式:
$ 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 ...; done
in循环的替代(请参阅for
源代码)尽管据我所知从未有过记录。
所有ksh
(从 Bourne shell 派生的原始版本,以及 ksh93 重写版本),pdksh
1(及其衍生版本),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
那个((...))
和{ ...; }
代替都不do ...; done
是 POSIX。
也可以看看Bash for 循环中“do”关键字的用途是什么?更多for
循环形式。
¹ 不是早期版本,也不是它所基于的 Forsyth shell。它于 1994 年在 5.1.1 中添加,这可能解释了为什么它被记录在那里