在Shell脚本中阻止注释

the*_*rty 230 shell

有没有一种简单的方法可以在shell脚本中注释掉一段代码?

sun*_*256 326

在bash中:

#!/bin/bash
echo before comment
: <<'END'
bla bla
blurfl
END
echo after comment
Run Code Online (Sandbox Code Playgroud)

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

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

  • 可爱的技巧 - 只要'END'关键字(当然,用户选择)不会出现在要注释掉的材料内部的一条线上. (21认同)
  • @kalengi:是的; 引号中使用的单词可以是任何方便的; `EOF`是一个经典的例子(```,一个感叹号本身也是如此),但你可以使用`SNURFLE_BURGERS`或`classical_end_marker`或任何其他单词不会出现在一行上注释掉的材料.我会试着用空间等进行试验,但这个词也可能适用于它们. (8认同)
  • @MB_CE,请参阅http://stackoverflow.com/questions/32126653/how-does-end-work-in-bash-to-create-a-multi-line-comment-block#32126942.也就是说 - 它正在运行一个命令(`:`),它不会读取其输入并始终以成功的值退出,并将"注释"作为输入发送.不是很多. (5认同)
  • 它绝对有效,但任何人都可以详细说明这是如何工作的?谢谢 (4认同)
  • 很好用的这里doc :) (2认同)
  • (但是,如果删除单引号,则有效。) (2认同)
  • 你很有名:http://codextechnicanum.blogspot.com/2013/11/comment-out-block-of-code-in-bash-shell.html (2认同)
  • 我认为编写活动代码来创建被动代码令人难以置信的丑陋和困惑......只需使用好的旧块选择模式并按#; 这有什么大问题? (2认同)

Osc*_*Ryz 86

shell脚本没有块注释.

使用vi(是vi),您可以轻松地从第n行到第m行发表评论

<ESC>
:10,100s/^/#/
Run Code Online (Sandbox Code Playgroud)

(读取,从第10行到第100行用#符号替换行开头(^).)

并且不发表评论

<ESC>
:10,100s/^#//
Run Code Online (Sandbox Code Playgroud)

(读取,从第10行到第100行替换行开头(^)后跟#注释//.)

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

  • 只是一个提示 - 如果你正在使用vim,这最终会突出显示每一行的开头,添加`| noh`到最后.管道分离了额外的命令,而'noh`则用于nohighlight.搜索词突出显示将在您下次搜索内容时自动恢复.示例:`:10,100s/^ /#/ g | noh` (5认同)

小智 48

您可以使用:

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

  • 这是经典的,但正如http://stackoverflow.com/a/19409316/832230所述,只是`if [];`也可以. (14认同)
  • 或许更清楚:"如果错误;".http://stackoverflow.com/a/18019516/2097284 (11认同)
  • 这似乎只是工作,评论文本实际上是代码.我用管道和分号的注释遇到了问题.Sunny256的答案奏效了. (3认同)

dev*_*ull 25

以下应该适用于sh,bash,kshzsh.

要注释的代码块可以放在里面,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"
Run Code Online (Sandbox Code Playgroud)

执行上面的代码会导致:

This is outside the commented block
Run Code Online (Sandbox Code Playgroud)

例如,为了取消注释如此评论的代码块

alias BEGINCOMMENT="if : ; then"
Run Code Online (Sandbox Code Playgroud)

代替

alias BEGINCOMMENT="if [ ]; then"
Run Code Online (Sandbox Code Playgroud)

在上面的例子中.


van*_*ric 23

如果你能躲避单引号:

__='
blah blah comment.
'
Run Code Online (Sandbox Code Playgroud)


ste*_*anB 14

在Vim:

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

      :'<,'>s/^/#
    
    Run Code Online (Sandbox Code Playgroud)
  5. 打进去

例如

shift-V
jjj
:s/^/#
<enter>
Run Code Online (Sandbox Code Playgroud)

  • 取消注释使用`:s/^#/` (7认同)

Rel*_*ve0 6

使用: '在打开和'关闭。

例如:

: '
This is a
very neat comment
in bash
'
Run Code Online (Sandbox Code Playgroud)

这是来自拉斯维加斯的榜样发现这里

  • 黑客风格,但很棒 (4认同)
  • 一个问题是,如果其中碰巧有一个字符串结尾“”,这些多行字符串就会结束。 (3认同)

hor*_*rta 5

您可以使用 Vi/Vim 的 Visual Block 模式,该模式专为以下内容而设计:

Ctrl-V  
Highlight first element in rows you want commented  
Shift-i  
#  
esc  
Run Code Online (Sandbox Code Playgroud)

取消注释将是:

Ctrl-V  
Highlight #'s  
d  
l  
Run Code Online (Sandbox Code Playgroud)

这是 vi 执行此类操作的交互方式,而不是计算或读取行号。

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


Rus*_*y75 5

老实说,为什么要进行如此多的过度设计......

我认为编写主动代码来生成被动代码确实是一种不好的做法。

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

记事本示例:

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

要删除:Alt-鼠标向下拖动,Shift-右箭头,删除。

  • 用户很可能在终端中。无法假设鼠标环境。 (12认同)