在Shell脚本中阻止注释


249

有没有简单的方法可以注释掉Shell脚本中的代码块?


2
有趣的是,这样简单易懂的问题有多么不同和复杂的答案。
Sigur

Answers:


347

在bash中:

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

''周围的END分隔符是重要的,否则里面的东西例如像块$(command)将被解析并执行。

有关说明,请参阅这个问题。


24
可爱的把戏-只要'END'关键字(当然,这是用户选择的)就不会在要注释的材料中单独出现在一行上。
乔纳森·勒夫勒

9
@kalengi:是的;引号中使用的单词可以很方便;EOF是一个经典示例(!感叹号本身也是如此),但是您可以使用SNURFLE_BURGERSclassical_end_marker或任何其他在注释掉的材料中不会单独出现在一行上的单词。我会尝试使用空格等,但这个词也很适合它们。
乔纳森·勒夫勒

4
绝对可以,但是任何人都可以详细说明它是如何工作的吗?谢谢
mbbce 2015年

5
@MB_CE,请参阅stackoverflow.com/questions/32126653/…。就是说-它正在运行一个命令(:),该命令不读取其输入,并且始终以成功值退出,并发送“注释”作为输入。没什么。
查尔斯·达菲

2
我认为编写主动代码来创建被动代码非常丑陋和混乱。只需使用良好的旧块选择模式并按#;这有什么大问题?
Rusty75

90

在shell脚本上没有任何块注释。

使用vi(yes,vi),您可以轻松地从第n行到m行注释

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

(从第10行到第100行读取带有#号的替代行开头(^)。)

并用发表评论

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

(即从第10行到第100行的替换行开头(^),后跟#,并注明//。)

vi在任何地方几乎都是普遍的/bin/sh


将正则表达式放在vi上的不错技巧,可将#放在行前。
Atiq Rahman

5
只是一个提示-如果您使用的是vim,但最终会突出显示每一行的开头,请添加|noh到结尾。管道分隔其他命令,并且noh不突出显示。下次您搜索内容时,搜索词突出显示将自动恢复。范例::10,100s/^/#/g|noh
马修(Matthew)

我需要通过脚本将其自动化。有没有一种方法可以使用vi对文件进行处理而无需人工干预?
蒂莫西·斯旺

1
@TimothySwan我以为gawk或sed程序可以做到这一点……。
BeowulfNode42 '18 -4-18

我最喜欢用vi注释(或添加前缀)的块的方式:转到要开始注释的行的开头(例如,<SHIFT>+G 10 <ENTER>然后0通过任何其他导航方式)。然后使用<CTRL>+V进入可视块模式并突出显示要注释的所有行的开头(在此示例中90 J)。然后按SHIFT+I插入突出显示的块之前。输入注释符号(例如#),然后按<ESC>完成前缀。这个解释听起来很长,但是以我的经验,它在实践中要快得多。
Ueffes

52

您可以使用:

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

14
这很经典,但是正如stackoverflow.com/a/19409316/832230所指出的那样,它if [ ];也可以工作。
Acumenus 2015年

12
也许更清晰的:if false;stackoverflow.com/a/18019516/2097284
卡米尔·古德塞内

3
这似乎只能起作用,是注释文本实际上是代码。我遇到了关于管道和分号的评论问题。Sunny256答案有效。
swdev

更简洁的是[];使用的测试是
贾斯汀·邓肯

27

以下应该适用于shbashkshzsh

可以将要注释的代码块放在BEGINCOMMENT和内ENDCOMMENT

[ -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"

在上面的示例中。


23

如果可以避开单引号:

__='
blah blah comment.
'

我喜欢这个。但是,双下划线是什么意思?据我所知,按照惯例,它只是一个变量名,应将其视为私有?
Chessofnerd

还提供了大多数编辑器中的语法突出显示功能,并且可以在需要时使用$ __进行调用,尽管为清晰起见,我建议使用变量名,例如documentation或docs。
jasonleonhard

您也可以在此处在
jasonleonhard

这应该是最好的答案。只需放置一些虚拟变量名而不是双下划线
B Abali

试过这个,但是因为有-F'而失败了;在块内注释掉。
10


14

在Vim中:

  1. 转到要评论的第一行
  2. shift-V (进入视觉模式),在块中上下突出显示行
  3. 选择时执行以下操作 :s/^/#/
  4. 该命令将如下所示:

      :'<,'>s/^/#
  5. 点击进入

例如

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

7
取消注释使用:s/^#/
-Buge

检查@horta的答案:stackoverflow.com/a/28376319/3506015-按键的更少!
geedoubleya

4

您可以使用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而不是ctrl-v进入Visual Block模式(因为这是粘贴的快捷方式)。


喜欢这种简单的方法。:o)
geedoubleya

4

老实说,为什么要进行过多的工程...

我认为编写用于生成被动代码的主动代码确实是一个坏习惯。

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

记事本示例:

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

删除:向下按住Alt键,向右移动箭头,然后删除。


8
用户最有可能在终端中。无法假定鼠标环境。
加里

它们还存在吗?我通常以图形方式进行编辑,然后使用vi粘贴回去,这将是一个简单的解决方法。
Rusty75 '18

2

sunny256接受的答案中的this-doc技巧的一种变化是使用Perl关键字进行注释。如果您的注释实际上是某种文档,则可以开始在注释块内使用Perl语法,该语法允许您将其打印出格式正确的格式,并将其转换为手册页等。

就外壳而言,您只需要替换'END''=cut'

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

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

etc.

=cut
echo "after comment"

(位于“ 在shell脚本中嵌入文档 ”中)


0

另一种模式是:如果您的编辑者没有“注释”选项,

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

完成

它可以与任何编辑器一起使用


0

我喜欢单行打开和关闭:

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

“ ##”可帮助我轻松地找到块注释的开始和结束。如果有很多,我可以在数字“ ##”后加上数字。要关闭评论,只需在“ []”中添加“ 1”即可。我还避免了在注释块中单引号引起的一些问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.