我知道如何在 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 的反引号命令替换,人们可以将这些注释放置在长命令行的任何位置,即使它是跨行拆分的。我已将 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`
您可以将参数存储在数组中:
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[@]}"
我担心,一般来说,你无法做到你所要求的。您能做的最好的事情就是在命令之前的行上添加注释,或者在命令行末尾添加一个注释,或者在命令之后添加注释。
您无法以这种方式在命令中散布注释。
\
表达了合并行的意图,因此出于所有意图和目的,您试图将注释散布在单行中,但这无论如何都不起作用,因为 \
必须位于行的末尾才能达到这样的效果。
根据pjh对此问题的另一个答案的评论,将
IFS
替换为已知不包含非空白字符的变量。
comment=
who ${comment# This is the command} \
-u ${comment# This is the argument}
为什么参数扩展没有被引用?该变量用空字符串初始化。当发生参数扩展时,
#
运算符(与shell注释字符#
无关,但用于相似性)尝试从参数值中剥离实际注释。当然,结果仍然是一个空字符串。
未加引号的参数扩展会经历分词和路径名生成。在这种情况下,两个进程都不会从空字符串创建任何其他单词,因此结果仍然是空字符串。这样的空字符串将被简单地丢弃,而不会影响它出现的命令。上面正好等价于
who \
-u