在 shell 脚本中拆分长命令

在 shell 脚本中拆分长命令

我一直在编写 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>则将其视为行延续(即,将其从输入流中删除并有效地忽略)。

相关内容