Syntax 使用IF语句时,如何将shell命令拆分为多行?

Syntax 使用IF语句时,如何将shell命令拆分为多行?,syntax,sh,Syntax,Sh,当命令是if语句的一部分时,如何将命令拆分为shell中的多行 这项工作: if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1 fi 这不起作用: # does not work: if ! fab --

当命令是
if
语句的一部分时,如何将命令拆分为shell中的多行

这项工作:

if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1                                                                       
fi
这不起作用:

# does not work:
if ! fab --fabfile=.deploy/fabfile.py \ 
  --forward-agent \
  --disable-known-hosts deploy:$target; then   
  rc=1
fi
我得到的不是执行整个命令,而是:

./script.sh: line 73: --forward-agent: command not found

更重要的是,我对Bash的理解中缺少了什么可以帮助我将来理解这个问题和类似的问题?

如果在反斜杠之后和换行之前有空格(空格或制表符1),那么换行将失败。没有这样的空白,您的示例对我来说很好:

$ cat test.sh
if ! fab --fabfile=.deploy/fabfile.py \
   --forward-agent \
   --disable-known-hosts deploy:$target; then
     echo failed
else
     echo succeeded
fi

$ alias fab=true; . ./test.sh
succeeded
$ alias fab=false; . ./test.sh
failed
从注释中提升了一些细节:shell中的行延续反斜杠并不是特例;这只是一般规则的一个例子,即反斜杠“引用”紧跟其后的字符,防止它通常受到任何特殊处理。在这种情况下,下一个字符是换行符,阻止的特殊处理是终止命令。通常,一个被引用的字符会包含在命令中;相反,反斜杠换行符会被完全删除。但除此之外,机制是相同的。最重要的是,反斜杠只引用紧跟其后的字符;如果该字符是一个空格或制表符,那么您只需要得到一个文本空格或制表符(这将是它自己的独立参数,因为反斜杠阻止空格折叠成周围分隔其他参数的不带引号的空格);反斜杠对后续换行没有影响

正如Czetechnology所指出的,1或运输返回。Bash不能处理Windows格式的文本文件,即使在WSL中也不行。或者Cygwin,但至少他们的Bash端口添加了一个
set-o igncr
选项,您可以将其设置为允许回车。

对于Windows/WSL/Cygwin等用户:

确保行尾是标准的Unix换行符,即仅限
\n
(LF)

使用Windows行结束符
\r\n
(CRLF)行结束符将中断命令行中断


这是因为将
\
放在以Windows行结尾的行末尾会转换为
\
\r
\n

正如Mark在上文中正确解释的那样:


如果在反斜杠之后和换行之前有空格,行继续将失败


这不仅包括空格(
)或制表符(
\t
),还包括回车(
\r
)。

错误是什么?我能够执行
$if!cp-n log/server1.log\>。;那就不要复制;fi
无误,在
\
后有换行符。在终端反斜杠
\
后是否有空格?它们很难被看到。如果这样做,您可能想看看是否可以使编辑器删除尾随空格或使其更可见。是的,是在结束符反斜杠之后添加空格。完全地谢谢。是的,对不起,我应该发布“错误”(意外结果)!我的错!现在编辑。你的理解是什么?这也不是问题的一部分。马克,你知道,我一定有空白。只有在
`s之后添加空格时,我才能重现错误。例如,在第一个
``之后添加一个时,我会得到
/soundops:line 73:--forward agent:command not found
。我的问题是我不理解这个错误。为什么空白会导致这种错误?空格+
\n
“否定”了``并限定了一个命令?换行符前面的反斜杠阻止换行符终止命令。但是就像“\n”这样的特殊转义序列只在反斜杠和n之间不起作用一样,反斜杠换行符只在反斜杠和换行符之间不起作用。哈哈,哇,这当然有道理。我从来没有这样想过。大开眼界,但很简单:这只是一条逃过的新线。我讨厌看不见的角色。如果它们都是可见的,对我来说会更有意义。非常感谢。在大多数编辑器中,您可以使这些不可见的字符可见。反斜杠和换行将从有效的命令行中删除,但下一行的任何前导空格都将保留。因此,这是否是一个问题取决于在单行命令中空白是否是一个问题。这修复了在Windows中创建脚本,然后在Windows bash中使用它时产生的问题(例如,bash-c MyShellScript.sh,其中MyShellScript.sh是在Windows编辑器中创建的)。您必须以UNIX格式保存MyShellScript.sh,可能需要使用记事本++。^对于使用记事本++的用户,您可以在底部看到文件的行尾。如果它读取Windows(CL CR),那么您应该在Unix(LF)中更改它。你可以点击它来改变它。非常感谢!你的答案是一个巨大的帮助,即使在2020年!