【问题标题】:Commenting out a set of lines in a shell script注释掉 shell 脚本中的一组行
【发布时间】:2010-11-29 11:38:00
【问题描述】:

我想知道是否有办法在 shell 脚本中注释掉一组行。 我怎么能那样做?我们可以在其他编程语言中使用 /* */。 这在我转换/使用/修改另一个脚本时最有用 我想保留原来的行而不是删除。

为所有未使用的行查找和前缀#似乎是一项繁琐的工作。

假设脚本中有 100 行后续行不使用。 我想一口气把它们全部评论出来。这可能吗?

【问题讨论】:

标签: unix shell comments editing


【解决方案1】:

最通用和最安全的方法是将注释放入无效引用中 here-document,像这样:

<<"COMMENT"
    This long comment text includes ${parameter:=expansion}
    `command substitution` and $((arithmetic++ + --expansion)).
COMMENT

引用上面的COMMENT定界符是必要的,以防止参数 扩展,命令替换和算术扩展,这将发生 否则,作为 Bash 手册 states 和 POSIX shell 标准 specifies

在上述情况下,不引用 COMMENT 将导致变量 parameter 被分配文本expansion,如果它为空或未设置,则执行命令 command substitution,递增变量arithmetic 并递减 变量expansion

比较其他解决方案:

使用if false; then comment text fi 要求评论文本是 语法正确的 Bash 代码,而自然 cmets 通常不是,如果 仅用于可能的不平衡撇号。 : || { comment text } 也是如此 构造。

将 cmets 放入单引号 void 命令参数中,如 :'comment text',具有无法包含撇号的缺点。双引号 参数,如:"comment text",仍受参数扩展的影响, 命令替换和算术扩展,与未引用的相同 here-document 内容,并可能导致上述副作用。

使用脚本和编辑器工具自动为每行添加前缀 带有“#”的块有一些优点,但不能完全回答问题。

【讨论】:

    【解决方案2】:
    if false
    then
    
    ...code...
    
    fi
    

    false 总是返回 false 所以这总是会跳过代码。

    【讨论】:

    • bash 不是一种预处理语言...当在 C 中用作预处理器命令时,这个技巧很有用。如果你按照你的建议去做,你就无法避免可能的语法错误。
    • 我实际上不介意被告知“禁用”代码中的语法错误。
    • :/ 这当然不是最好的答案,IMO。
    • 最佳答案如下,@asev69
    • @Artelius 有时,您想发表评论因为存在您目前不关心的未解决的语法错误
    【解决方案3】:

    您也可以使用以下方式放置多行 cmets:

    : '
    comment1comment1
    comment2comment2
    comment3comment3
    comment4comment4
    '
    

    根据 Bourne Shell builtins 的 Bash 参考

    :(冒号)

    :[参数]

    除了扩展参数和执行重定向之外什么都不做。返回状态为零。

    感谢 Ikram 在帖子 Shell script put multiple line comment 中指出这一点

    【讨论】:

    • 同样重要的是要注意冒号和单撇号之间有一个空格。虽然作者已经说清楚了,但像你这样的人可能真的会错过它,没有空间它就不会运行。
    • 我认为这是最好的答案。非常简洁明了。
    • 您可以使用: ' : 打开和关闭您的评论。 :)
    【解决方案4】:

    您可以使用“此处”文档而无需发送命令。

    #!/bin/bash
    echo "Say Something"
    <<COMMENT1
        your comment 1
        comment 2
        blah
    COMMENT1
    echo "Do something else"
    

    Wikipedia Reference

    【讨论】:

    • 此处未引用的文档的内容仍会受到参数扩展、命令替换和算术扩展的影响,因此可能会产生副作用,例如将反引号中的文本作为命令执行。
    【解决方案5】:

    文本编辑器有一个很棒的功能,叫做搜索和替换。你没有说你使用什么编辑器,但由于 shell 脚本往往是 *nix,而我使用 VI,这里是注释某些 shell 脚本的第 20 到 50 行的命令:

    :20,50s/^/#/
    

    【讨论】:

    • 我就是这样做的。要取消注释,试试这个::20,50s/^#//
    【解决方案6】:
    : || {
    your code here
    your code here
    your code here
    your code here
    }
    

    【讨论】:

    • 这并不比if false; then … fi 好,因为它不会从语法分析中隐藏[可能格式错误的]代码。
    【解决方案7】:

    如果你只是将代码包装到函数中呢?

    所以这个:

    cd ~/documents
    mkdir test
    echo "useless script" > about.txt
    

    变成这样:

    CommentedOutBlock() {
      cd ~/documents
      mkdir test
      echo "useless script" > about.txt
    }
    

    【讨论】:

      【解决方案8】:

      据此site

      #!/bin/bash
      foo=bar
      : '
      This is a test comment
      Author foo bar
      Released under GNU 
      '
      
      echo "Init..."
      # rest of script
      

      【讨论】:

        【解决方案9】:

        根据您使用的编辑器,有一些快捷方式可以注释一行代码。

        另一种解决方法是将您的代码放在“if (0)”条件块中;)

        【讨论】:

        • 0 在 bash 中是真实的。如果我没记错的话,if (0); then 会一直执行
        【解决方案10】:

        这个 Perl 单行代码删除文件 orig.sh 的第 1 到 3 行(第一行编号为 0),并将注释版本写入 cmt.sh

        perl -n -e '$s=1;$e=3; $_="#$_" if $i>=$s&&$i<=$e;print;$i++' orig.sh > cmt.sh
        

        显然您可以根据需要更改边界数。

        如果你想就地编辑文件,它会更短:

        perl -in -e '$s=1;$e=3; $_="#$_" if $i>=$s&&$i<=$e;print;$i++' orig.sh
        

        演示

        $ cat orig.sh 
        a
        b
        c
        d
        e
        f
        
        $ perl -n -e '$s=1;$e=3; $_="#$_" if $i>=$s&&$i<=$e;print;$i++' orig.sh > cmt.sh
        
        $ cat cmt.sh 
        a
        #b
        #c
        #d
        e
        f
        

        【讨论】:

        • sed 更简单:echo -e "1\n2\n3\n4\n5\n6" | sed -e "2,4 s/^/#/"
        猜你喜欢
        • 2013-08-23
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 2017-06-02
        • 2015-12-23
        • 2021-11-28
        • 1970-01-01
        • 2013-03-25
        相关资源
        最近更新 更多