我最近开始研究Shell脚本,并且希望能够注释掉Shell脚本中的几行内容。我的意思是在C / Java的情况下:
/* comment1
comment2
comment3
*/`
我该怎么办?
:
在行的第一列(没有前导空格)中。
我最近开始研究Shell脚本,并且希望能够注释掉Shell脚本中的几行内容。我的意思是在C / Java的情况下:
/* comment1
comment2
comment3
*/`
我该怎么办?
:
在行的第一列(没有前导空格)中。
Answers:
使用: '
在打开和'
关闭。
例如:
: '
This is a
very neat comment
in bash
'
#
S和从来没有这个...
:
是简写形式,true
而true
不会处理任何参数。(手册页:SYNOPSIS true [ignored command line arguments]
:
和之间的间隔'
很重要
# '
在最后一行而不是单引号上使用。这样,我可以#
在第一行放置一个来激活代码块。删除#
第一行上的以停用代码。
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日之前的评论可能不再适用。
Bash没有为多行注释提供内置语法,但是有一些黑客使用现有的bash语法“立即开始工作”。
我个人认为,最简单的方法(即最不吵,最不奇怪,最容易键入,最明确)是使用带引号的HEREDOC,但要清楚地表明您在做什么,并在所有位置使用相同的HEREDOC标记:
<<'### BLOCK COMMENT'
line 1
line 2
line 3
line 4
### BLOCK COMMENT
单引号HEREDOC标记避免了一些shell解析的副作用,例如可能导致崩溃或输出的奇怪替代,甚至解析了标记本身。因此,单引号为您提供了更多关于打开-关闭注释标记的自由。例如,以下使用三元哈希,该哈希在bash中建议多行注释。如果没有单引号,这将使脚本崩溃。即使您删除了###
,如果不是单引号,它也FOO{}
会使脚本崩溃(或者如果没有set -e
则导致脚本打印不良替换):
set -e
<<'### BLOCK COMMENT'
something something ${FOO{}} something
more comment
### BLOCK COMMENT
ls
您当然可以使用
set -e
<<'###'
something something ${FOO{}} something
more comment
###
ls
但是对于不熟悉此技巧的读者,其意图肯定不够清楚。
如今,任何优秀的编辑器都允许您按ctrl- /或类似内容来取消/注释选择。每个人都绝对理解:
# something something ${FOO{}} something
# more comment
# yet another line of comment
尽管可以接受,但是如果您想重新填写段落,这不如上面的块注释方便。
当然还有其他技术,但是似乎没有“常规”的方法可以做到。如果###>
并且###<
可以将其添加到bash中以指示注释块的开始和结束,那将是一件很不错的事情,似乎很简单。
true
),即使它们没有不要冒险破坏(heredoc方法没有,但冒号版本可以),1)黑客仍然掩盖了意图:如果没有第一行暗示多行注释,大多数人会想知道代码在做什么;和2)有意外的暗角(例如必须加双引号,在某些情况下用heredoc标记加引号等)。
${FOO:=bar}
or ${FOO{}}
。第一个可能对创建和设置变量有副作用FOO
,第二个将引发严重的替换 错误;这两种效果您都不希望从真实评论中获得。
在阅读了其他答案之后,我想到了以下内容,恕我直言,这很明显是一则评论。特别适用于脚本使用信息:
<< ////
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.
////
作为程序员,斜线序列会立即在我的大脑中记录为注释(即使斜线通常用于行注释)。
当然,"////"
只是一个字符串。前缀和后缀中的斜杠数必须相等。
Usage:
<< EOF ... EOF
您对此有何看法?
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
在上面的示例中,“ B”块被注释掉,但是“ A”块中不是“ B”块的部分未被注释掉。
运行该示例将产生以下输出:
foo {
./example: line 5: fn: command not found
foo }
can't happen
我尝试了选择的答案,但是发现当我运行包含它的shell脚本时,整个东西都被打印到屏幕上了(类似于jupyter笔记本如何将所有内容都用'''xx'''
引号引起来),并且最后出现错误消息。它什么也没做,但是:吓人。然后我意识到在编辑它时,单引号可以跨越多行。因此,让我们只将块分配给变量。
x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"
ls -l
date
'
x=
a 代替:
,您将具有相同的效果而没有副作用。唯一的缺点是注释不能包含单引号。这就是为什么我更喜欢使用带引号的heredoc:注释者可以根据需要选择合适的终止字符串。
简单的解决方案,不是很聪明:
暂时阻止脚本的一部分:
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
#我喜欢懒惰和简单。我将#与有趣的解决方法结合使用:
1按:]查找ctrl + F或cmd + F或其他[以触发查找功能
2在查找字段中使用正则表达式,例如: (^.+)
3替换为:# $1
或者,如果您愿意#$1
#注意:您的编辑器中可能没有这三个步骤。在这种情况下,请使用在线正则表达式工具(出于政策原因,在此处不能建议一个):
(^.+)
的正则表达式和#$1
或#\1
作为替代模式#享受您的哈希!
ctrl+/
,许多编辑器都具有热键,即使在多行中也可以打开或关闭注释。它还可以根据您使用的语言来更改注释字符。