Shell 在Bash中创建多行注释的方法?

Shell 在Bash中创建多行注释的方法?,shell,comments,multiline,Shell,Comments,Multiline,我最近开始学习shell脚本,我希望能够注释掉shell脚本中的一组行。我的意思是,就像C/Java一样: /* comment1 comment2 comment3 */` 我该怎么做?使用:“打开,使用”关闭 例如: : ' This is a very neat comment in bash ' bash中的多行注释 : <<'END_COMMENT' This is a heredoc (<<) redirected to a NOP comm

我最近开始学习shell脚本,我希望能够注释掉shell脚本中的一组行。我的意思是,就像C/Java一样:

/* comment1
   comment2 
   comment3
*/`

我该怎么做?

使用
:“
打开,使用
关闭

例如:

: '
This is a
very neat comment
in bash
'

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

:注意:我根据评论和其他答案更新了此答案,因此2020年5月22日之前的评论可能不再适用。今天我还注意到一些IDE,比如VS代码和PyCharm,不识别包含空格的HEREDOC标记,而bash对此没有问题,所以我再次更新这个答案

Bash没有为多行注释提供内置语法,但有一些使用现有Bash语法的黑客“碰巧现在可以工作”

就个人而言,我认为最简单的方法(即最不嘈杂、最不怪异、最容易键入、最明确)是使用带引号的HEREDOC,但要清楚地表明你在做什么,并在任何地方使用相同的HEREDOC标记:

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

line 3
line 4
###BLOCK-COMMENT
你当然可以用

set -e

<<'###'
something something ${FOO{}} something
more comment
###

ls
尽管不可否认,如果你想重新填充你的段落,这远不如上面的块注释那么方便


当然还有其他的技术,但似乎没有一种“传统”的方法。如果
####>
####在阅读了这里的其他答案后,我提出了以下建议,我认为这是一个评论。特别适用于脚本内使用信息:

<< ////

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.

////

你对这件事有什么看法

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
  }
}

下面是如何在bash中进行多行注释

这个机制有两个优点,我很欣赏。一是注释可以嵌套。另一个是,只需注释掉起始行即可启用块

#!/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

简单的解决方案,不太聪明:

临时阻止脚本的一部分:

if false; then
    while you respect syntax a bit, please
    do write here (almost) whatever you want.
    but when you are
    done # write
fi
有点复杂的版本:

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

我尝试了选择的答案,但发现当我运行一个shell脚本时,整个事情都被打印到了屏幕上(类似于jupyter笔记本在
''xx'
引号中打印所有内容),并且在最后出现了一条错误消息。它什么也没做,只是:吓人。然后我在编辑时意识到单引号可以跨越多行。所以让我们将块分配给一个变量

x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"

ls -l
date

'
直截了当 批驳 一段代码 我知道

:||{ 块 密码

}

:(并且还增加了大量的不可读性和潜在的错误源。IMHO最好只使用多个
s,并且永远不要这样…@jm666 IMHO在您不知道所有用例的情况下使用never这个词从来都不是一个好主意。要解释:
true
的缩写,
true
不处理任何参数ers。(手动页面:
symposis true[忽略的命令行参数]
之间的空格很重要。
对代码块稍微修改一下,这样我就可以轻松地打开或关闭代码。我的更改是在最后一行使用
而不是单引号。这样我就可以在第一行放一个
来激活代码块。删除e
#
在第一行禁用代码。您可以使用如下哈希:#这是一个注释。我知道,但对于多行来说这有点麻烦。应该注意的是,以下答案要求
位于行的第一列(无前导空格)。这是有效的,当前接受的答案不适用(对我而言)。可能值得注意的是,这不是注释本身。这是一个heredoc,作为多行字符串重定向到NOP命令。单引号对于禁用解析变量和命令非常重要。@Freek需要添加空格我在一个简单的bash脚本中测试了这一点,该脚本在Debian中通过shebang行#!/bin/bash运行,但失败了。我正在尝试在我找到下面的答案之前,他们都失败了。因为他们失败了,我对他们投了向下的票,而对实际运行正常的答案投了向上的票。在你的例子中,很好的测试。前面的
是不必要的。只要从
开始,这一个就很容易/清晰地记住了!正如前面的答案所指出的,作为ide从反引号中,$(…)序列也将被扩展,因为这两种形式都是命令替换。“它们都是黑客,所以将来可能会破坏脚本。”你能详细说明一下吗?虽然黑客在语义上是有效的,但在语法上是有效的,不应该在将来中断,除非bash决定发狂并中断heredocs。@perlancar,如果我们同意黑客是使用与问题完全无关的语言/库功能的解决方案的话(比如使用herdeoc作为注释,或者在donothing命令上使用参数,比如
true
),那么即使它们没有破坏的风险(herdeoc方法没有,但冒号版本有),1)黑客仍然混淆了意图:没有第一行暗示多行注释,大多数人都会挠头想知道代码在做什么;2)有意想不到的黑暗角落(比如必须加倍引号,在某些情况下引用herdoc标记,等等)@Oliver:如果不加引号,变量可能会产生令人讨厌的副作用。想象一下,您在heredoc注释中嵌入了一个字符串,如
${FOO:=bar}
${FOO{}
。第一种可能会对创建和设置变量
FOO
产生副作用,第二种可能会引发严重的替换错误;这两种效果都是您从真实评论中无法预料的。我几乎错过了
用法:
对上述答案的伟大补充。老实说,我认为您可以编辑上述答案,并在,不要单独回答。这里有几个“以上”答案(取决于您的排序顺序)。另外,通过单独回答,我想解释我选择的字符串背后的原理。
hello,不是作为一个问题,而不是对原始问题的回答。在我看来不好。它需要com
if false; then
    while you respect syntax a bit, please
    do write here (almost) whatever you want.
    but when you are
    done # write
fi
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
x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"

ls -l
date

'