为什么`for i do cmd中不需要分隔符; done`

Wil*_*ell 7 bash shell language-lawyer

for i do echo $i; done
Run Code Online (Sandbox Code Playgroud)

这怎么合法?(我希望它用一个额外的分号写成for i; do echo $i; done)它适用于bash,dash,zsh和ksh.标准(我的意思是http://pubs.opengroup.org/onlinepubs/9699919799/)指出:

The for loop requires that the reserved words do and done be used to
delimit the sequence of commands.  The format for the for loop is as follows:

    for name [ in [word ... ]]
    do
        compound-list
    done
Run Code Online (Sandbox Code Playgroud)

很明显,当省略"in word"时,它do就是一个分隔符.因此暗示似乎是[ in [word .. ]]实际属于右侧右括号内的分隔符(换行符).有人能指出标准中的任何理由证明这种(IMO)可怕的滥用语言吗?

小智 1

也许其他人可以向您介绍语法的历史,但在 shell 脚本中,空格字符(默认情况下)是分隔符。该;字符只是一个语句分隔符。它经常用来代替换行符来将逻辑编写为“一行”。shell 脚本中行尾的分号是多余的,因为它们都是命令分隔符。

另外值得注意的是上面的括号语法旨在表明语法的这些部分是可选的(即您实际上并不在脚本中使用括号)。

最后,我发现将贝壳视为......好吧,贝壳是件好事。你可以用它们编写脚本,作为“语言”,它们是图灵完备的,但语法通常有点时髦。