为什么在 'for i do cmd 中不需要分隔符;done' [复制]

Why is a separator not required in `for i do cmd; done` [duplicate]

提问人:William Pursell 提问时间:4/20/2018 最后编辑:William Pursell 更新时间:4/20/2018 访问量:116

问:

for i do echo $i; done

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

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

因此,当省略“in word”时,很明显是作为分隔符。因此,含义似乎是 之后的分隔符(换行符)实际上属于右括号内。有人可以指出标准中的任何内容来证明这种(IMO)对语言的可怕滥用是合理的吗?do[ in [word .. ]]

bash shell 语言-律师

评论

0赞 rici 4/21/2018
@willian:哎呀,忘了我的欺骗投票会是一把锤子。但我认为我之前的问题确实涵盖了完全相同的领域,可能有不同的编辑倾向。如果您不同意,请告诉我。
0赞 William Pursell 4/21/2018
我的问题不仅是你的骗局,而且问得也远没有那么严格!
0赞 PesaThe 4/21/2018
@rici 中的分号呢?for ((i=0;i<5;++i)) do echo foo; done
0赞 rici 4/21/2018
@pesathe:iirc,有一个已弃用的 bash 扩展,允许省略该分号。

答:

1赞 John Moon 4/20/2018 #1

也许其他人可以填写语法的历史记录,但在 shell 脚本中,空格字符(默认情况下)是分隔符。字符只是一个语句分隔符。它通常被用来代替换行符来将逻辑编写为“单行”。shell 脚本中行末尾的分号是多余的,因为两者都是命令分隔符。;

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

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

评论

0赞 William Pursell 4/20/2018
好点:分隔符与分隔符。有趣的是,该标准使用了短语“do and done be used to delimit”,而“separate”本来是一个更合适的词。
4赞 whoan 4/20/2018 #2

如果你看一下 GNU 手册,你会看到循环有这样的语法:

for

    The syntax of the for command is:

    for name [ [in [words …] ] ; ] do commands; done

因此,正如您所看到的,额外的分号是可选部分的一部分。


linux-die 手册页也作了相同的说明。

评论

2赞 Nahuel Fouilleul 4/20/2018
也许是因为分号是必需的,以指示变量参数列表的末尾,并且可以是有效的参数 (),但是由于 for 的参数中没有分隔符,因此不再需要分隔符;dofor i in a do c; do echo $i;done"$@"
2赞 Nahuel Fouilleul 4/20/2018
此外,高尔夫球手使用的未记录的 bash 语法也较短for i;{ echo $i;}