续行+行注释,在同一行? [复制]

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[@]"

请注意,您几乎肯定也想创建 ARGUMENTSMORE_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

【讨论】:

注意注释行本身不包含命令替换,因为它们仍会被扩展。

以上是关于续行+行注释,在同一行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在同一行上有多个等号是啥意思? [复制]

如何在同一行代码中使用 `if` 和 `for`? [复制]

idea复制多行加格式

怎样使复制的多个DIV标签都在同一行显示?

如何在同一行记录控制台或清除节点中的控制台? [复制]

Linux之编辑器强大的vim使用手册