最近,我偶然发现了一个以前从未见过的多行注释类型-这是一个脚本示例:这种评论方式叫什么,如何找到有关它的更多信息?

评论

如果您将代码包装到函数中以将其注释掉怎么办? CommentedOutBlock(){echo“ test”; }

正如其他人已经提到的那样,多行注释本机不可用。所以我用if假;然后<您想要多少行> fi

#1 楼

那不是多行注释。 #是单行注释。
:(冒号)根本不是注释,而是一个外壳内置命令,基本上是一个NOP,是一个空操作,除了返回true以外,什么都不做,例如true(因此将$?设置为0作为a副作用)。但是,由于它是命令,因此它可以接受参数,并且由于它忽略其参数,因此在大多数情况下,它表面上像注释。这种冲突的主要问题是论点仍在扩展,导致许多意想不到的后果。参数仍然受到语法错误的影响,仍然执行重定向,因此: > file将截断file,并且: $(dangerous command)替换仍将运行。即使是多行注释也要坚持下去。切勿尝试(ab)使用#发表评论。 shell中没有专用的多行注释机制,类似于类似于:的语言中的斜线/* */形式。建议的做法,我会提到可以使用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


评论


+1非常重要,以使<<上的单引号保持不变-这会关闭替换和扩展。

–格伦·杰克曼
2012年4月27日在12:11

另外要特别注意的是,用:填充shell脚本,因为应该注释的内容会导致额外的RAM / CPU消耗。它不会满足于桌面上的简单操作,但是如果每秒执行数百次或数千次操作,您将无所事事,而且速度很快。

– bahamat
2012年8月29日在21:28



@bahamat:如果您每秒执行数百或数千次操作,希望您不要在shell中编写它... = /

– 7heo.tk
2014年5月24日在1:40

有时,对多行文本使用null实用程序可能会很有用。以:<< = cut开头的注释使可以在shell脚本中编写POD,有关详细信息,请参见此示例。这样就可以使用perldoc script.sh。但是,此答案中显示的多行注释绝对是注释块(每行以#开头)。

–basic6
2014年12月4日上午10:14

这是一个关于Heredocs的精彩讨论,用于注释和其他有趣的用例(甚至包括dynaimc脚本生成):tldp.org/LDP/abs/html/here-docs.html#EX71C

– bguiz
16年8月22日在1:02

#2 楼

这不是任何评论风格。 :内置命令绝对不执行任何操作;在这里被评论滥用了。

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.


#3 楼

在早期的shell中,冒号是创建注释的唯一方法。

但是,这不是真正的注释,因为该行的解析方式与其他命令完全相同解析,可能会有副作用。对于
示例:

: ${a:=x} # assigns the value 'x' to the variable, 'a'

: $(command) # executes 'command'


(有时,冒号仅用于调用这些副作用
,但后来并未使用作为注释。)

使用冒号注释掉一段脚本有时会很方便


: '
while [ "$n" -ne "$x" ]
do
  : whatever
done
'


与每行前面加上#相比,这是一个很好的节省时间,尤其是如果
注释只是暂时的。

评论


单引号注释方法不适用于本身使用单引号的脚本的任何部分。而且,如果您在尽可能多的地方使用引号,则意味着整个脚本中都会散布合法的单引号。仅使用任何可让您进行逐行注释的体面的编辑器,就这么简单。

– jw013
13年1月16日在21:18

您说对了,只有在引用部分中没有单引号的情况下,它才有效。但是,脚本不必使用很多单引号。在查看我的一些脚本时,我发现它们相对稀疏,许多可以用双引号代替。

–克里斯·约翰逊(John F.A. Johnson)
13年7月8日在1:36



单引号或双引号的选择应该几乎不受琐碎且无关紧要的事情的影响,例如脚本的文本本身是否是有效的单引号字符串。单引号用于防止扩展,而双引号则允许某些扩展并需要额外的分析。这是确定使用哪个的真正标准。

– jw013
13年7月11日在3:27

到目前为止,这是最时髦的方法。非常适合少量文档。我比/ * * /更喜欢它,呃,别让我开始<!-->!

–alex灰色
2013年9月5日23:13

#4 楼

如果您的注释在脚本的结尾,则可以这样进行:

#!/bin/sh
echo 'hello world'
exec true
we can put whatever we want here
\'\"$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
abcdefghijklmnopqrstuvwxyz{|}~