【问题标题】: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 # 符号都会遮蔽行继续反斜杠 \,反之亦然。有什么建议吗?

【问题讨论】:

    标签: bash shell sh


    【解决方案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
    

    【讨论】:

    • 注意注释行本身不包含命令替换,因为它们仍会被扩展。
    猜你喜欢
    • 2015-08-06
    • 2015-07-15
    • 2014-06-28
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2020-06-15
    相关资源
    最近更新 更多