Way to create multiline comments in Bash?

后端 未结 8 529
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-04 04:59

I have recently started studying shell script and I\'d like to be able to comment out a set of lines in a shell script. I mean like it is in case of C/Java :



        
相关标签:
8条回答
  • 2020-12-04 05:08

    Here's how I do multiline comments in bash.

    This mechanism has two advantages that I appreciate. One is that comments can be nested. The other is that blocks can be enabled by simply commenting out the initiating line.

    #!/bin/bash
    # : <<'####.block.A'
    echo "foo {" 1>&2
    fn data1
    echo "foo }" 1>&2
    : <<'####.block.B'
    fn data2 || exit
    exit 1
    ####.block.B
    echo "can't happen" 1>&2
    ####.block.A
    

    In the example above the "B" block is commented out, but the parts of the "A" block that are not the "B" block are not commented out.

    Running that example will produce this output:

    foo {
    ./example: line 5: fn: command not found
    foo }
    can't happen
    
    0 讨论(0)
  • 2020-12-04 05:09

    After reading the other answers here I came up with the below, which IMHO makes it really clear it's a comment. Especially suitable for in-script usage info:

    << ////
    
    Usage:
    This script launches a spaceship to the moon. It's doing so by 
    leveraging the power of the Fifth Element, AKA Leeloo.
    Will only work if you're Bruce Willis or a relative of Milla Jovovich.
    
    ////
    

    As a programmer, the sequence of slashes immediately registers in my brain as a comment (even though slashes are normally used for line comments).

    Of course, "////" is just a string; the number of slashes in the prefix and the suffix must be equal.

    0 讨论(0)
  • 2020-12-04 05:11

    Multiline comment in bash

    : <<'END_COMMENT'
    This is a heredoc (<<) redirected to a NOP command (:).
    The single quotes around END_COMMENT are important,
    because it disables variable resolving and command resolving
    within these lines.  Without the single-quotes around END_COMMENT,
    the following two $() `` commands would get executed:
    $(gibberish command)
    `rm -fr mydir`
    comment1
    comment2 
    comment3
    END_COMMENT
    
    0 讨论(0)
  • 2020-12-04 05:23

    Note: I updated this answer based on comments and other answers, so comments prior to May 22nd 2020 may no longer apply. Also I noticed today that some IDE's like VS Code and PyCharm do not recognize a HEREDOC marker that contains spaces, whereas bash has no problem with it, so I'm updating this answer again.

    Bash does not provide a builtin syntax for multi-line comment but there are hacks using existing bash syntax that "happen to work now".

    Personally I think the simplest (ie least noisy, least weird, easiest to type, most explicit) is to use a quoted HEREDOC, but make it obvious what you are doing, and use the same HEREDOC marker everywhere:

    <<'###BLOCK-COMMENT'
    line 1
    line 2
    
    line 3
    line 4
    ###BLOCK-COMMENT
    

    Single-quoting the HEREDOC marker avoids some shell parsing side-effects, such as weird subsitutions that would cause crash or output, and even parsing of the marker itself. So the single-quotes give you more freedom on the open-close comment marker.

    For example the following uses a triple hash which kind of suggests multi-line comment in bash. This would crash the script if the single quotes were absent. Even if you remove ###, the FOO{} would crash the script (or cause bad substitution to be printed if no set -e) if it weren't for the single quotes:

    set -e
    
    <<'###BLOCK-COMMENT'
    something something ${FOO{}} something
    more comment
    ###BLOCK-COMMENT
    
    ls
    

    You could of course just use

    set -e
    
    <<'###'
    something something ${FOO{}} something
    more comment
    ###
    
    ls
    

    but the intent of this is definitely less clear to a reader unfamiliar with this trickery.

    Note my original answer used '### BLOCK COMMENT', which is fine if you use vanilla vi/vim but today I noticed that PyCharm and VS Code don't recognize the closing marker if it has spaces.

    Nowadays any good editor allows you to press ctrl-/ or similar, to un/comment the selection. Everyone definitely understands this:

    # something something ${FOO{}} something
    # more comment
    # yet another line of comment
    

    although admittedly, this is not nearly as convenient as the block comment above if you want to re-fill your paragraphs.

    There are surely other techniques, but there doesn't seem to be a "conventional" way to do it. It would be nice if ###> and ###< could be added to bash to indicate start and end of comment block, seems like it could be pretty straightforward.

    0 讨论(0)
  • 2020-12-04 05:23

    Simple solution, not much smart:

    Temporarily block a part of a script:

    if false; then
        while you respect syntax a bit, please
        do write here (almost) whatever you want.
        but when you are
        done # write
    fi
    

    A bit sophisticated version:

    time_of_debug=false # Let's set this variable at the beginning of a script
    
    if $time_of_debug; then # in a middle of the script  
        echo I keep this code aside until there is the time of debug!
    fi
    
    0 讨论(0)
  • 2020-12-04 05:28

    what's your opinion on this one?

    function giveitauniquename()
    {
      so this is a comment
      echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
      the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
      only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
      1, for #((
      2, this #wouldn't work either
      function giveitadifferentuniquename()
      {
        echo nestable
      }
    }
    
    0 讨论(0)
提交回复
热议问题