在 shell 脚本中拆分长命令

5 shell-script

我一直在编写 Unix shell 脚本,但我在正确格式化方面缺乏经验。在很多情况下,我不得不写长行作为单个命令执行。

问题是:有没有一种方法可以将一个 shell 命令的单长行拆分为多行,但使其作为单个命令执行?

Kus*_*nda 9

可以通过像这样转义换行符来拆分单个简单命令中的长行:

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

要么将长字符串分解成更小、更易读的组件,要么使用尾随的“\”来表示行中的中断。

来自“男人的狂欢”:

如果出现 \ 对,并且反斜杠本身没有被引用,则 \ 被视为行继续(即,它从输入流中删除并有效地被忽略)。

  • 请注意,反斜杠必须是该行的 **last** 字符:注意不要在其后添加任何空格。 (2认同)