为什么可以
for (( expr1 ; expr2 ; expr3 ))
do commands
done
写成:
for (( expr1 ; expr2 ; expr3 ))
do
commands
done
其中do commands
可以两行写入而没有错误,而
for (( expr1 ;
expr2 ; expr3 )) ; ...
会错吗?
关于在bash中继续进入下一行的一般规则是什么?感谢。
答案 0 :(得分:1)
以这种方式思考
for (( expr1 ; expr2
; expr3 ))
现在不会起作用,它是两个单独的命令
for (( expr1 ; expr2
和
; expr3 ))
这两个都不是完整的命令,因此会导致错误。
而
do
commands
done
评估为
do (nothing)
commands
done
与
相同do;commands
done
与
相同do;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;commands
done
由于可以在do之后放置多个命令,因此第一行被视为空命令。就像你可以在循环之外的单独命令之间留下行。
P.S我意识到这个答案有点笨拙,所以如果有人理解我的意思,最后清理它然后随意:)答案 1 :(得分:1)
我不知道是否存在关于在shell中使用换行符的“一般规则”。但是,shell grammar(这是bash等shell的基础)明确标记了显式换行符是命令一部分的位置。其中包括:
compound_list
之前或之后,这就是为什么可以在(
之后立即{
(当用于启动复合命令时),do
,{ {1}},elif
,else
,for
,if
,then
和until
,紧接while
之前)
(用于终止复合命令时)。}
,&&
或||
|
或;
之后。&
或in
声明中的for
之前case
语句的子句中,在启动子句的模式或终止它的case
之后。此外,换行符是使用反斜杠,双引号或单引号引用的普通字符,如果前面带有单引号字符串之外的反斜杠,则从输入中删除。
Posix语法没有定义;;
语法,它来自for ((expr;expr;expr))
,并且在v2.04中被合并到ksh93
中。但是,在该构造中,分号是语法的一部分,用于分隔算术表达式,而不是语句。由于这些分号不是语句分隔符,因此不能用换行符替换它们。但是,bash
确实允许他们通过换行符跟随。