在Shell脚本中阻塞注释

是否有一种简单的方法来注释掉shell脚本中的代码块?

398804 次浏览

在bash中:

#!/bin/bash
echo before comment
: <<'END'
bla bla
blurfl
END
echo after comment

END分隔符周围的''很重要,否则块内的内容(例如$(command))将被解析并执行。

有关解释,请参见问题。

shell脚本上没有块注释。

使用vi(是的,vi),你可以轻松地从n行注释到

<ESC>
:10,100s/^/#/

(从第10行到第100行,用#符号代替第(^)行。)

联合国的评论是

<ESC>
:10,100s/^#//

(从第10行到第100行,替换行开始(^),后面跟着#,并注明//。)

vi几乎在任何有/bin/sh的地方都是通用的。

在Vim中:

  1. 去你想评论的第一行
  2. shift-V(进入可视模式),在块中向上向下突出行
  3. 在选择:s/^/#/上执行以下命令
  4. 命令如下:

      :'<,'>s/^/#
    
  5. hit enter

e.g.

shift-V
jjj
:s/^/#
<enter>

你可以使用:

if [ 1 -eq 0 ]; then
echo "The code that you want commented out goes here."
echo "This echo statement will not be called."
fi

如果你能避开单引号:

__='
blah blah comment.
'

下面应该适用于shbashkshzsh

要注释的代码块可以放在BEGINCOMMENTENDCOMMENT中:

[ -z $BASH ] || shopt -s expand_aliases
alias BEGINCOMMENT="if [ ]; then"
alias ENDCOMMENT="fi"


BEGINCOMMENT
echo "This line appears in a commented block"
echo "And this one too!"
ENDCOMMENT


echo "This is outside the commented block"

执行上述代码将导致:

This is outside the commented block

为了取消注释这样注释的代码块,例如

alias BEGINCOMMENT="if : ; then"

而不是

alias BEGINCOMMENT="if [ ]; then"

在上面的例子中。

你可以使用Vi/Vim的可视块模式,它是为这样的东西设计的:

Ctrl-V
Highlight first element in rows you want commented
Shift-i
#
esc

不加评论的是:

Ctrl-V
Highlight #'s
d
l

这是vi做这类事情的交互式方式,而不是计算或读取行号。

最后,在Gvim中使用ctrl-q进入Visual Block模式,而不是ctrl-v(因为这是粘贴的快捷键)。

sunny256给出的已接受的答案中的here-doc技巧的一个变体是使用Perl关键字进行注释。如果您的注释实际上是某种文档,那么您可以开始在注释块中使用Perl语法,这允许您将其打印出来,将其转换为手册页,等等。

就shell而言,你只需要用'=cut'替换'END'

echo "before comment"
: <<'=cut'
=pod


=head1 NAME
podtest.sh - Example shell script with embedded POD documentation


etc.


=cut
echo "after comment"

(在"在shell脚本中嵌入文档"上找到)

老实说,为什么要这么过度设计……

我认为编写主动代码来生成被动代码是一种糟糕的做法。

我的解决方案:大多数编辑器都有块选择模式。只需使用它添加#到所有你想注释掉的行。 有什么大不了的…

记事本的例子:

创建方法:Alt -鼠标向下拖动,按#。

删除:alt -鼠标向下拖动,右移箭头,删除。

另一种模式是: 如果你的编辑器没有BLOCK注释选项,

  1. 打开编辑器的第二个实例(例如File=>New File…)
  2. 从您正在处理的上一个文件中,只选择要注释的部分
  3. 复制并粘贴到新的临时文件的窗口中…
  4. 打开编辑菜单,选择REPLACE,输入要替换的字符串'\n'
  5. 输入替换字符串:'\n#'
  6. 按下“替换全部”按钮

完成

它适用于任何编辑器

使用: '打开,'关闭。

例如:

: '
This is a
very neat comment
in bash
'

这是从维加斯的例子找到在这里

我喜欢单线开闭:

if [ ]; then ##
...
...
fi; ##

“##”可以帮助我轻松地找到块注释的开始和结束。我可以在“##”后面加上一个数字,如果我有很多的话。要关闭注释,我只需在“[]”中插入一个“1”。我还避免了在注释块中使用单引号时遇到的一些问题。

可以将注释代码放在函数中。这样做的好处是你可以“不评论”。通过在定义之后调用函数。

除非你打算“不评论”;通过调用函数,函数内的文本不必在语法上正确。

ignored() {
echo this is  comment
echo another line of comment
}

许多GUI编辑器将允许您选择一个文本块,并按"{"自动在选定的代码块周围加上大括号。

让我们把这些最好的想法和建议结合起来。

alias _CommentBegin_=": <<'_CommentEnd_'"

如前所述,单引号非常重要,因为没有它们 $(commandName)和${varName}将被求值

你可以这样使用它:

_CommentBegin_
echo "bash code"
or
none code can be in here
_CommentEnd_

别名使使用更加明显和更好看。

在vscode ctrl+K+C (ctrl+K+U取消注释)。