我一直在编写 Unix shell 脚本,但我对正确的格式缺乏经验。在很多情况下,我必须编写长行才能作为单个命令执行。
问题是:有没有一种方法可以将 shell 命令的单个长行拆分为多行,但使其作为单个命令执行?
答案1
单个简单命令中的长行可以通过转义换行符来分割,如下所示:
rsync --archive --itemize-changes \
"$source" \
"$target"
反斜杠必须是该行的最后一个字符。
POSIX 标准中的相关位:
2.2.1 转义字符(反斜杠)
未加引号的A
<backslash>
应保留后续字符的字面值,但 a 除外<newline>
。如果 a<newline>
跟在 后面<backslash>
,shell 会将其解释为行继续。在<backslash>
将<newline>
输入拆分为标记之前应删除and 。由于转义符<newline>
被完全从输入中删除并且不被任何空格替换,因此它不能用作标记分隔符。
在单个复合命令中,例如管道或和/或列表等,通常有不需要转义的换行符的自然点(因为&&
,||
和|
是命令终止符):
[ -e "$pathname" ] &&
printf 'Removing %s\n' "$pathname" &&
rm -- "$pathname"
awk -f script.awk <infile |
grep -e "$pattern" |
cat header.txt - >result.txt
答案2
要么将长字符串分成更小的、可能更易读的组件,要么使用尾随“\”来表示行中的中断。
来自“男人狂欢”:
如果
\<newline>
出现一对,并且反斜杠本身没有被引号引起来,\<newline>
则将其视为行延续(即,将其从输入流中删除并有效地忽略)。