请注意,只要有";"出现在命令语法的描述中,它可能会被一个或多个换行符替换



我正在研究"for loop in bash"的语法。这是用于循环的语法之一

for (( i=0; i<4; i++ )); do echo $i; done

我试着把"在for循环中有新行时,它会给我一个错误(我只能在"do"或echo之后添加新行(。即

for (( i=0
i<4
i++ ))
do echo $i; done

为什么我们需要有一个尾部和尾部空白进行算术扩展?背后的原因是什么?

谢谢。

为什么我们需要有一个尾部和尾部空白来进行算术扩展?

因为这是bash中for的替代形式的语法。它需要;。仍然:

for ((i=0;
i<4;
i++)); do

很好。

请注意,无论何处为";"出现在命令语法的描述中,它可能被一个或多个换行取代

不"其中"-在case内部时,不能用两个换行符替换;;。在命令列表中时,;可能会被换行符替换:

列表中可能会出现一个或多个换行符的序列来分隔命令,相当于分号

((...))是bash扩展,不是命令列表,所以,嗯,不存在。

这看起来像是我的疏忽。提交一份错误报告。如果你包括一个补丁,它可能会进入;你永远不会知道。

它使语言不一致,并导致文档说谎,这就足够了。

然而,有一个小问题,因为不幸的是,像以下这样的构造目前是允许的:

# note lack of backslash line continuations
$ for (( i =
>  0 ; i <
>  5 ; i++ )) ; do echo $i ; done
0
1
2
3
4

如果您想使用一个或多个换行符来替换所需的分号,那么任何地方都允许使用换行符这一事实会产生歧义。

扩展允许任意空白的原因可能是$(( ))算术扩展做到了这一点:

$ echo $((
> 2 
> +
> 2
> ))
4

for (( ))中包含的三个表达式仅遵循算术展开语法。

最新更新