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


384

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

这有效:

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的了解缺少什么,这将有助于我将来了解此问题和类似问题?


2
有什么错误?我能够在$ if ! cp -n log/server1.log \ > .; then echo no copy; fi没有错误的情况下执行换行符\
悲惨的变量

15
终端反斜杠后是否还有空格\ ?他们很难看。如果这样做,您可能希望查看是否可以使编辑器删除尾随空格或使其更显眼。
msw

10
是的,在终端反斜杠之后是空格。完全。谢谢。
德米特里·明科夫斯基2013年

是的,对不起,我应该发布“错误”(意外结果)!我的错!现在编辑。
德米特里·明科夫斯基2013年

你的理解是什么?这也不是问题的一部分。
hakre 2014年

Answers:


566

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

$ 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中的行继续反斜杠并不是真正的特例;反斜杠“引用”紧随其后的字符只是一般规则的一个实例,从而防止了通常会受到的特殊处理。在这种情况下,下一个字符是换行符,并且要防止的特殊处理是终止命令。通常,引号中的字符会逐字显示在命令中;反斜杠换行符将被完全删除。但是除此之外,机制是相同的。反斜杠仅引用紧随其后的字符;如果该字符是空格或制表符,那么您只会得到一个带引号的空格或制表符,而任何后续换行符都将不加引号。


5
马克,你知道,我一定有空格。我只能在`s. For example, when adding one after the first `获得后添加空白时重现错误./soundops: line 73: --forward-agent: command not found。我的问题是我不明白这个错误。为什么有空格会导致该错误?空格+ \n“否定”并定界命令?
德米特里·明科夫斯基2013年

83
在换行符前加反斜杠可防止换行符终止命令。但是,就像特殊的转义序列(例如“ \ n”)仅在反斜杠和n之间不起作用一样,反斜杠-换行符在反斜杠和换行之间也不起作用。
马克·里德

18
哈哈哈哇,那当然是有道理的。从来没有那样看过。令人大开眼界,但如此简单:这只是一条逃脱的换行符。我讨厌看不见的人物。如果它们全都可见的话,它们对我来说就有意义得多。谢谢!
德米特里·明科夫斯基2013年

7
在大多数编辑器中,您可以使那些不可见的字符可见。
lucasvc

1
反斜杠和换行符将从有效命令行中删除,但保留下一行中的任何前导空格。因此,是否有问题取决于单行命令中此时的空格是否会成为问题。
马克·里德

52

对于Windows / WSL / Cygwin等用户:

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

使用Windows行尾\r\n(CRLF)行尾将破坏命令行中断。


这是因为\在一行的末尾带有Windows的行尾会转换为 \ \r \n
正如Mark正确解释的那样:

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

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


1
这解决了在Windows中创建脚本然后在Windows bash中使用脚本时所产生的问题(例如,在Windows编辑器中创建MyShellScript.sh的bash -c MyShellScript.sh)。您可能必须使用notepad ++将UNIX格式的MyShellScript.sh保存。
BSalita
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.