续行+行注释,在同一行? [复制]
Posted
技术标签:
【中文标题】续行+行注释,在同一行? [复制]【英文标题】:Line continuation + line comment, on the same line? [duplicate] 【发布时间】:2014-10-21 03:52:37 【问题描述】:我的 shell 脚本中有一个包含很长参数列表的调用:
foo-command \
--important-argument $ONE \
--indispensable-flag $ENABLED \
--an-optional-toggle "will probably be commented out some day" \
$ARGUMENTS \
$MORE_ARGUMENTS
我不能在这个多行调用中插入 cmets,可以吗?
例如,假设我如何注释掉 --an-optional-toggle
行?
如何在$ARGUMENTS
之后添加# in sorted order
评论?
无论我尝试什么,octothorp #
符号都会遮蔽行继续反斜杠 \
,反之亦然。有什么建议吗?
【问题讨论】:
【参考方案1】:foo-command $(
# hello
printf --important-argument $ONE # free as a bird
printf --indispensable-flag $ENABLED
# to comment anywhere we wish
printf --an-optional-toggle "will probably be commented out some day"
printf $ARGUMENTS
printf $MORE_ARGUMENTS
)
它并不完美:回显-n
很难,因为echo
会解释它;当您希望保留引号时,引号可能会消失,等等。事实上,正如评论者在下面所说的那样,引用的字符串会被破坏;也许你可以解决这个问题,但如果你有 Bash,这里的其他答案会更好。
【讨论】:
如果可选注释的参数实际上包含空格,这将不起作用。 这可以改进。printf
而不是 echo
将缓解一些问题,包括 -n
(和其他)解释。可以内联命令替换并摆脱额外的函数定义。
你们是对的,@chepner 的回答比我在这里所做的要好得多。所有人都向 bash 大师致敬。
@JohnZwinck,振作起来!从与普通sh
兼容的意义上说,您的解决方案具有便携 的优势。
请注意,printf(1)
尝试扩展其第一个参数,因此使用普通的 printf $ARGUMENTS
不是一个好主意。 printf "%s\n" $ARGUMENTS
更好。【参考方案2】:
不,但您可以将参数存储在数组中。这使您既可以注释掉单独的行,也可以包含穿插的 cmets。
args=( --important-argument "$ONE"
--indispensable-flag "$ENABLED"
# --an-optional-toggle "will probably be commented out some day"
$ARGUMENTS # in sorted order
$MORE_ARGUMENTS
)
foo-command "$args[@]"
请注意,您几乎肯定也想创建 ARGUMENTS
和 MORE_ARGUMENTS
数组,所以 args
最终看起来像
args=( --important-argument "$ONE"
--indispensable-flag "$ENABLED"
# --an-optional-toggle "will probably be commented out some day"
"$ARGUMENTS[@]" # in sorted order
"$MORE_ARGUMENTS[@]"
)
【讨论】:
+1 使用 BASH 数组是比使用长多行命令行正确的方法。 附带说明:这是严格依赖 Bash 的方法。数组在旧的 shell 中不起作用,也就是“sh
”,这对某些人来说可能很重要。
如果您担心可移植性,请将您的问题标记为sh
而不是bash
。
应该注意的是,使用带有"$ARGUMENTS[@]"
的数组而不是普通的、未加引号的$ARGUMENTS
变量可以避免不必要的路径名扩展值。【参考方案3】:
尝试backtick comment hackas proposed in an earlier response 来解决同样的问题。
在你的情况下,这将是:
foo-command \
--important-argument $ONE \
--indispensable-flag $ENABLED \
`#--an-optional-toggle "will probably be commented out some day"` \
$ARGUMENTS \
$MORE_ARGUMENTS
【讨论】:
注意注释行本身不包含命令替换,因为它们仍会被扩展。以上是关于续行+行注释,在同一行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章