请注意,只要在命令语法的描述中出现“;”,它都可以替换为一个或多个换行符

问题描述

我正在查看“ bash中的for循环”的语法。这是使用for循环的语法之一

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。在list of commands内时,;可以用换行符代替:

一个或多个换行符序列可能会出现在列表中以分隔命令,等同于分号

((...))是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 (( ))中包含的三个表达式仅遵循算术扩展语法。