如何为多行命令添加行注释[重复]

问题描述 投票:0回答:4

我知道如何在 Bash 脚本中编写多行命令,但是如何为多行命令中的每一行添加注释?

CommandName InputFiles      \ # This is the comment for the 1st line
            --option1 arg1  \ # This is the comment for the 2nd line
            --option2 arg2    # This is the comment for the 3nd line

但不幸的是,继续字符

\
之后的注释会破坏命令。

bash shell comments
4个回答
925
投票

我就是这样做的。本质上,通过使用 Bash 的反引号命令替换,人们可以将这些注释放置在长命令行的任何位置,即使它是跨行拆分的。我已将 echo 命令放在您的示例前面,以便您可以执行该示例并查看它是如何工作的:

echo CommandName InputFiles `#1st comment` \
             --option1 arg1 `#2nd comment` \
             --option2 arg2 `#3rd comment`

另一个示例,您可以在一行的不同点放置多个注释:

some_cmd --opt1 `#1st comment` --opt2 `#2nd comment` --opt3 `#3rd comment`

169
投票

您可以将参数存储在数组中:

args=(
    InputFiles           # This is the comment for the 1st line
    --option1 arg1       # This is the comment for the 2nd line
    --option2 arg2       # This is the comment for the 3nd line
    #--deprecated-option # Option disabled
)
CommandName "${args[@]}"

您甚至可以添加空行以增强可读性:

args=(

    # This is the comment for the 1st line
    InputFiles

    # This is the comment for the 2nd line
    --option1 arg1

    # This is the comment for the 3nd line
    --option2 arg2

    # Option disabled
    #--deprecated-option

)
CommandName "${args[@]}"

如果您需要使用其他 shell 运算符,例如布尔值和管道,则不能将它们放置在数组中,但可以在执行时将它们“粘合”在一起:

args1=(
    InputFiles           # This is the comment for the 1st line
    --option1 arg1       # This is the comment for the 2nd line
    --option2 arg2       # This is the comment for the 3nd line
    #--deprecated-option # Option disabled
)
args2=(
    --option arg         # Another comment
    example.config
)
success=(
    # Put the command in the array if it is clearer
    notify-send
    Hooray
    'The thing is done'
)
fail=(
    notify-send
    'Uh oh'
    "The thing didn't work"
)
CommandName1 "${args1[@]}" | CommandName2 "${args2[@]}" 2>> error.log && "${success[@]}" || "${fail[@]}"

115
投票

我担心,一般来说,你无法做到你所要求的。您能做的最好的事情就是在命令之前的行上添加注释,或者在命令行末尾添加一个注释,或者在命令之后添加注释。

您无法以这种方式在命令中散布注释。

\
表达了合并行的意图,因此出于所有意图和目的,您试图将注释散布在单行中,但这无论如何都不起作用,因为
\
必须位于行的末尾才能达到这样的效果。


21
投票

根据pjh对此问题的另一个答案的评论,将

IFS
替换为已知不包含非空白字符的变量。

comment=
who ${comment# This is the command} \
    -u ${comment# This is the argument}

为什么参数扩展没有被引用?该变量用空字符串初始化。当发生参数扩展时,

#
运算符(与shell注释字符
#
无关,但用于相似性)尝试从参数值中剥离实际注释。当然,结果仍然是一个空字符串。

未加引号的参数扩展会经历分词和路径名生成。在这种情况下,两个进程都不会从空字符串创建任何其他单词,因此结果仍然是空字符串。这样的空字符串将被简单地丢弃,而不会影响它出现的命令。上面正好等价于

who \
  -u
© www.soinside.com 2019 - 2024. All rights reserved.