koj*_*iro 8 syntax bash for-loop
我偶然发现了这种奇怪的现象并且无法弄清楚它为什么会起作用:
$ for ((i=0;i<8;i++)) {
> printf '%d...' "$i";
> }; echo
0...1...2...3...4...5...6...7...
Run Code Online (Sandbox Code Playgroud)
一个for在使用bash循环括号语法?我根本无法使用非算术for循环重现这一点,并且manpage和help两者似乎都需要do:
$ help for
<SNIP>
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
Arithmetic for loop.
Equivalent to
(( EXP1 ))
while (( EXP2 )); do
COMMANDS
(( EXP3 ))
done
Run Code Online (Sandbox Code Playgroud)
嗯,如果我只是......
$ ((i=0)); while ((i<8)) { printf '%d...' "$i"; ((i++)); }
-bash: syntax error near unexpected token `{'
Run Code Online (Sandbox Code Playgroud)
不!
这是支撑for-loop语法吗?
PS - 这是在OS X Mavericks上测试的,包括自制软件安装的Bash 4.2.45(2) - 以及vanilla 3.2.51(1) - release.
将一些评论转移到答案中:
AFAIK,它在Bash中是一个很大程度上没有文档的黑客攻击,可能需要与Bourne shell兼容,它也支持括号符号,也没有记录.它不是Mac OS X特有的; 它也适用于Ubuntu 12.04.但它似乎不适用于Bash中的while循环或until循环.
你如何在Bourne shell语法中编写for循环算法?
它是一种编写for循环体的可选方法; 在Bourne shell中,条件的编写方式不同,但你可以编写类似的东西
for i in 1 2 3
{
echo $i
}
Run Code Online (Sandbox Code Playgroud)
在Bourne shell中,或者用来do代替{和done代替}.
(我忘记它存在,直到你的问题提醒我;我从来没有认真使用它,因为它没有记录,因此不能保证得到支持.)
在do ... done可以使用的地方{ ... }不能使用该构造; 你只能用do ... done一个后for,while或until循环,而你可以写{ echo Hi; }在任何地方的命令可能出现(例如if { echo Hi; }; then echo Lo; fi,你不能做到这一点与do和done.
检查这个答案的真实性的最好方法是从Heirloom项目下载Heirloom Bourne Shell.
我已经下载了Heirloom Bourne Shell(一个CVS存储库)的源代码并构建了它,并对其进行了测试.它确实接受后的括号for循环,并拒绝承认他们作为替代物do和done后until或while循环.