关于bash:如何为多行命令添加行注释

How to put a line comment for a multi-line command

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
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的反引号命令替换,可以将这些注释放在长命令行的任何位置,即使它是跨行分割的。我已将echo命令放在您的示例前面,以便您可以执行该示例并查看其工作原理:

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

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

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


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

1
2
3
4
5
6
7
8
9
args=(InputFiles      # This is the comment for the 1st line
      # You can have whole lines of comments in between, useful for:
      #--deprecated-option # This isn't use any more
      --option1 arg1  # This is the comment for the 2nd line

      # And even blank lines in between for readability
      --option2 arg2  # This is the comment for the 3nd line
     )
CommandName"${args[@]}"

但是,我认为如果只是为了允许每个参数的注释,这看起来有点hackish。因此,我只是重写注释,以便引用各个参数,并将其置于整个命令之上。


我担心,一般来说,你不能做你所要求的。您可以做的最好是对命令前面的行进行注释,或者在命令行末尾添加一条注释,或者在命令后注释。

您无法以这种方式在命令中散布注释。 \表示合并行的意图,因此对于所有意图和目的,您试图在单行中散布注释,这无论如何都不起作用,因为\必须位于行的末尾有这种效果。


根据pjh对此问题的另一个答案的评论,将IFS替换为已知不包含非空白字符的变量。

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