bash代码中的行继续规则?

时间:2015-03-25 15:31:20

标签: bash

为什么可以

for (( expr1 ; expr2 ; expr3 )) 
do commands 
done

写成:

for (( expr1 ; expr2 ; expr3 )) 
do 
commands 
done

其中do commands可以两行写入而没有错误,而

for (( expr1 ; 
expr2 ; expr3 )) ; ...

会错吗?

关于在bash中继续进入下一行的一般规则是什么?感谢。

2 个答案:

答案 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}},elifelseforifthenuntil,紧接while之前)(用于终止复合命令时)。
  • }&&||
  • 之后
  • 列表中的语句之间,或跟在列表中的语句的|;之后。
  • &in声明中的for之前
  • case语句的子句中,在启动子句的模式或终止它的case之后。
  • 也许我错过了其他一些背景:)

此外,换行符是使用反斜杠,双引号或单引号引用的普通字符,如果前面带有单引号字符串之外的反斜杠,则从输入中删除。

Posix语法没有定义;;语法,它来自for ((expr;expr;expr)),并且在v2.04中被合并到ksh93中。但是,在该构造中,分号是语法的一部分,用于分隔算术表达式,而不是语句。由于这些分号不是语句分隔符,因此不能用换行符替换它们。但是,bash确实允许他们通过换行符跟随