【问题标题】:Shell script multi-line commentShell脚本多行注释
【发布时间】:2017-11-24 17:19:02
【问题描述】:

我有一个很大的 shell 脚本文件。有时在进行修改时,我想注释掉其中的一部分。但是如下例所示的注释行给了我错误。

脚本:

#!/bin/bash
<<COMMENT1
read build_label
read build_branch_tag
build_date_tag=$(echo $build_label | sed "s/$build_branch_tag//g")
echo $build_path
COMMENT1
echo "HELLO WORLD"

错误信息:

sed:第一个 RE 不能为空

我只是想了解上述脚本有什么问题以及为什么评论部分无法正常工作。

【问题讨论】:

  • 您可以尝试在&lt;&lt;COMMENT1 之前添加: 和单引号吗?所以它看起来像:: &lt;&lt;'COMMENT1'
  • @ryekayo:谢谢你的建议。它似乎工作正常。
  • 可以在这里找到一个很好的解释:unix.stackexchange.com/questions/37411/… 然而,使用# 来评论多行更安全,我提供的链接将解释原因。

标签: shell sed


【解决方案1】:

首先,使用这里的文档来注释代码真的很脏!请改用#。如果您想评论多行,请使用您的编辑器。在 vim 中(例如从 10 到 15 的注释行):

:10,15s/^/#

但是,要解决您当前的问题,您需要将起始 here-doc 分隔符括在单引号中,如下所示:

<<'COMMENT'
...
COMMENT

使用单引号告诉 bash 它不应尝试在此处的文档正文中扩展变量或表达式。

【讨论】:

  • 哦,我不知道您可以通过在 HERE 分隔符周围使用引号来关闭扩展。不错!
  • 是的,很高兴拥有!我希望我将来能把你从一些逃避的 \\ 中拯救出来.. :)
【解决方案2】:

传统的 UNIX shell 不支持多行注释。您在这里所做的是使用所谓的“HERE 文档”而不使用它的值,这是一种获得多行注释等行为的常见技巧。

但是,仍然会评估 HERE 文档中的模式,这意味着您的 $(…) 已被执行。但是由于之前没有定义build_branch_tag,它会评估为一个空字符串,因此shell会执行sed s///g

您可以使用不同的技巧:

: '
Bla bla, no $expansion is taking place here.
'

这是在做什么:: 是一个无操作命令,它什么也不做。你传递给它的参数是一个字符串'…'。在单引号内,没有进行扩展/评估。不过,请注意“注释掉”区域内的'

【讨论】:

  • 我会更加强调你的最后一句话。
【解决方案3】:

您可以像这样在此处的文档中关闭参数替换:

<<"Endofmessage"

<<'Endofmessage'

<<\Endofmessage

这里的文档

这种类型的重定向指示 shell 从 当前源,直到仅包含分隔符的行(没有 尾随空白)可见。到目前为止读取的所有行都是 然后用作命令的标准输入。的格式 这里的文件是:

也许您也喜欢:我更喜欢在我的 bash 脚本中使用 nodepad++ 快捷键 ctrl+Q(切换注释)来执行多行 cmets。

【讨论】:

    【解决方案4】:

    如果这不是语法错误(打开字符串,...)

    #!/bin/bash
    
    if false;then
    read build_label
    read build_branch_tag
    build_date_tag=$(echo $build_label | sed "s/$build_branch_tag//g")
    echo $build_path
    fi
    
    echo "HELLO WORLD"
    

    如果 sysntax 错误或等效(未找到的地方,例如通过对失败代码的去角质部分搜索错误)

    #!/bin/bash
    
    #read build_label
    #read build_branch_tag
    #build_date_tag=$(echo $build_label | sed "s/$build_branch_tag//g")
    #echo $build_path
    
    echo "HELLO WORLD"
    

    为此,您可以使用: - 编辑器是否可以使用正则表达式查找/替换,如 vi(m) - 一个 sed(sed '14,45 s/^/#/' YourFile &gt; YourFile.Debug 其中 14 和 45 是要评论的第一行和最后一行)

    【讨论】:

      【解决方案5】:

      使用这里的文档来注释代码是安全和优雅的,就像这样:

      : <<'EOT'
      Example usage of the null command ':' and the here-document syntax for a 
      multi-line comment.  If the delimiter word ('EOT' here) is quoted, the 
      here-document will not be expanded in any way.  This is important, as 
      an unquoted delimiter will result in problems with unintended potential 
      expansions.  All of this here-doc text is redirected to the standard input 
      of :, which does nothing but return true.  
      EOT
      

      【讨论】:

        猜你喜欢
        • 2010-11-29
        • 2010-10-31
        • 2013-08-23
        • 2013-04-18
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多