Answers:
那不是多行注释。 #
是单行注释。
:
(冒号)根本不是注释,而是shell内置命令,它基本上是NOP,是一个空操作,除了返回true外,不执行任何操作,例如true
(因此设置$?
为0作为副作用)。但是,由于它是命令,因此可以接受自变量,并且由于它忽略其自变量,因此在大多数情况下,它的表面行为类似于注释。这种冲突的主要问题是论点仍在扩展,导致许多意想不到的后果。参数仍然受到语法错误的影响,仍然执行重定向,因此: > file
将截断file
,并且: $(dangerous command)
替换仍将运行。
在shell脚本中插入注释的最令人惊讶的完全安全的方法是使用#
。即使是多行注释也要坚持下去。 切勿尝试(滥用):
评论。Shell中没有专用的多行注释机制,类似于类语言中的斜杠星号/* */
形式C
。
为了完整起见,但不是因为建议这样做,因此我将提到可以使用here-documents进行多行“注释”:
: <<'end_long_comment'
This is an abuse of the null command ':' and the here-document syntax
to achieve a "multi-line comment". According to the POSIX spec linked
above, if any character in the delimiter word ("end_long_comment" in
this case) above is quoted, the here-document will not be expanded in
any way. This is **critical**, as failing to quote the "end_long_comment"
will result in the problems with unintended expansions described above.
All of this text in this here-doc goes to the standard input of :, which
does nothing with it, hence the effect is like a comment. There is very
little point to doing this besides throwing people off. Just use '#'.
end_long_comment
<<
在线-这会关闭替换和扩展。
: <<=cut
,可以在shell脚本中编写POD,有关详细信息,请参见此示例。这样就可以使用perldoc script.sh
。但是,此答案中显示的多行注释绝对应该是注释块(每行以开头#
)。
这不是任何评论风格。在:
内置的命令绝对没有; 在这里发表评论被滥用。
$ help :
:: :
Null command.
No effect; the command does nothing.
Exit Status:
Always succeeds.
在早期的shell中,冒号是创建注释的唯一方法。
但是,这不是真正的注释,因为该行的解析方式与其他命令的解析方式完全相同,并且可能会有副作用。例如:
: ${a:=x} # assigns the value 'x' to the variable, 'a'
: $(command) # executes 'command'
(有时,冒号仅用于引起这些副作用的目的,但并不用作注释。)
有时使用冒号注释掉脚本的一部分有时很方便:
: '
while [ "$n" -ne "$x" ]
do
: whatever
done
'
与在每行之前添加相比#
,这节省了很多时间,尤其是在注释只是暂时的情况下。
/* */
而且,不要让我开始<!-- -->
!
CommentedOutBlock() { echo "test"; }