带支撑的bash循环?

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语法吗?

  1. 随处记录(官方?)
  2. 在Bash中表示循环算术的合法不同方法?
  3. 关于循环的"正常"算法如何解释输入,我只是缺少一些东西?

PS - 这是在OS X Mavericks上测试的,包括自制软件安装的Bash 4.2.45(2) - 以及vanilla 3.2.51(1) - release.

Jon*_*ler 8

将一些评论转移到答案中:

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,whileuntil循环,而你可以写{ echo Hi; }在任何地方的命令可能出现(例如if { echo Hi; }; then echo Lo; fi,你不能做到这一点与dodone.

检查这个答案的真实性的最好方法是从Heirloom项目下载Heirloom Bourne Shell.


我已经下载了Heirloom Bourne Shell(一个CVS存储库)的源代码并构建了它,并对其进行了测试.它确实接受后的括号for循环,并拒绝承认他们作为替代物dodoneuntilwhile循环.