&&和||之后的bash行继续在哪里 有记载吗?


28

我已经在脚本中看过很多这种结构,并且自己使用过,但是令我感到困扰的是,我似乎在文档中找不到它。

例:

[ -f file1 ] &&
[ -f file2 ] &&
echo "Both files exist." ||
echo "One or the other file doesn't exist."

也可以在换行符之前用反斜杠来完成,如man bash

If a \<newline> pair appears,  and  the  backslash  is  not
itself  quoted,  the \<newline> is treated as a line continuation (that
is, it is removed from the input stream and effectively ignored).

例:

[ -f file1 ] && \
[ -f file2 ] && \
echo "Both files exist." || \
echo "One or the other file doesn't exist."

...但是这似乎没有必要。上面的第一个版本即使没有反斜杠也可以使用。

在哪里可以找到这个man bash?(此外,这是bash特定的还是POSIX兼容的?)


如果您正在寻找正式的bash或POSIX文档,请参阅Gilles的答案。但这在shell的控制和重定向运算符什么中进行了讨论- 对更多的意见;&()
G-Man说'恢复莫妮卡'

@ G-Man,我想那不是针对我的吗?只为将来的读者?正如我在问题中所说的那样,“令我感到困扰的是,我似乎在文档中找不到它。” 我已经知道它是如何工作的,所以这确实只是对官方文档的要求。:)
通配符

即使在数组的情况下,也存在隐式的行连续:names=( Rama Soma<newline> Sita Diya )。Python 在这里清楚地描述了这些但是Bash文档似乎没有。
jamadagni

Answers:


39

在某些明显存在未终止命令的情况下,将忽略换行符。这些环境包括控制操作后(&&|||&;;;,但没有!)。

我没有在bash手册中看到此内容。

在POSIX中,它是通过语法规则指定的。无论规则在哪里linebreak,您都可以有零个或多个换行符。


+1,我不知道它适用于简单的管道(|)。我希望我们也可以将它们放在下一行,以提高可读性,但这种方式行不通(如果这样做,则需要对前面的换行符进行换行)。
奥利维尔·杜拉克

1
@OlivierDulac怎么可能呢?在处理当前命令行时,应该如何得知您打算|在下一行的开头键入内容?请记住,外壳程序也可以交互使用,而不仅仅是在脚本中使用,并且语法是相同的。
Barmar

@Barmar:我知道,我确实知道这一点(在学校写编译器^^)...我说“我希望”,但这不是一个很合理的愿望
Olivier Dulac

1
@DocSalvager,您能否举一个有助于预防的逻辑错误示例?我很难看到它
。...–通配符

2
@DocSalvager,我实际上不会在编写代码时使用它,它只是一个示例。但是,如果没有最后一行(else子句),我将以这种方式使用它。(对于“如果这样做,那么就那样做” this && this2 && that就可以了,但是对于一个else子句,我将使用实际值if then else fi。)
通配符
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.