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