bash代码中的行延续规则?

bash代码中的行延续规则?,bash,Bash,为什么可以 写为: for (( expr1 ; expr2 ; expr3 )) do commands done 其中,do命令可以写入两行而不会出错,而 for (( expr1 ; expr2 ; expr3 )) do commands done 会错吗 在bash中延续到下一行的一般规则是什么?谢谢。这样想吧 for (( expr1 ; expr2 ; expr3 )) ; ... 将无法工作,因为现在它是两个独立的命令 for (( expr1 ; expr2

为什么可以

写为:

for (( expr1 ; expr2 ; expr3 )) 
do commands 
done
其中,
do命令
可以写入两行而不会出错,而

for (( expr1 ; expr2 ; expr3 )) 
do 
commands 
done
会错吗

在bash中延续到下一行的一般规则是什么?谢谢。

这样想吧

for (( expr1 ; 
expr2 ; expr3 )) ; ...
将无法工作,因为现在它是两个独立的命令

for (( expr1 ; expr2 
; expr3 )) 

这两个都不是完整的命令,因此将导致错误

鉴于

; expr3 ))
评估为

do 
commands 
done
这和

do (nothing)
commands
done
do;commands
done
这和

do (nothing)
commands
done
do;commands
done
由于在do之后可以放置多个命令,因此第一行被视为空命令。正如您可以在循环之外的单独命令之间保留行一样


注:我意识到这个答案有点含糊不清,所以如果有人理解我的意思以及如何清理它,那么请放心:)

我不知道是否有关于在shell中使用换行符的“一般规则”。但是,显式标记(它是bash等shell的基础)显式标记显式换行是命令一部分的位置。这些措施包括:

  • 复合列表之前或之后,这就是为什么它可以紧跟在
    {
    (用于启动复合命令时),
    do
    elif
    else
    for
    if
    然后
    直到
    while
    ,紧跟在
    之前)
    (用于终止复合命令时)
  • &&
    之后,
    |
    |
  • 在列表中的语句之间,或在
    之后
    &
    在列表中分隔语句
  • for
    case
    语句中的
    之前
  • case
    语句的子句中,在子句或
    开头的模式之后终止它
  • 也许我错过了其他一些上下文:)
此外,当使用反斜杠、双引号或单引号引用时,换行符是普通字符,如果在单引号字符串之外加上反斜杠,则会从输入中删除换行符


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

我想不出太多的语言会允许在
for
语句中使用回车符……虽然后面的反斜杠总是可以用来允许换行符……我本打算参考本节中关于这一点的内容,但实际上找不到信息技术这是for循环语法还是bash语法?不管怎样,问题是内部
不是语句分隔符,而是语法分隔符。因此,你不能像在其他地方用分号那样用换行符替换换行符。@EtanReisner:我认为该语法是在ksh93中引入的,但它从来不是Posix的一部分$(…)和(…)出现在最初的ksh,iirc中,但只有
$(…)
将其放入Posix中(尽管Posix认识到Shell可能实现
(…)
…列出了在2.04-devel中实现的功能,注释上写着“ksh93”。所以我想这是一个确认。