BASH 注释:#(散列)-vs- 之间的区别:(冒号)注释

Aru*_*gal 0 unix linux bash command comments

在 bash GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)或任何稳定版本中,您可以使用#:进行评论

这两个和有用性有什么区别?

我注意到#注释使整行成为注释,而:作用域/效果仅在它到达第一个\n;字符(在给定行中)之前。

[gigauser@someserver ~]$ # this is a # comment; echo this will not print
[gigauser@someserver ~]$ : this is a : comment; echo this will print
this will print
Run Code Online (Sandbox Code Playgroud)

在下面的代码中,为什么最后 2 条评论没有按预期工作,然后将它们视为评论(尽管::如果它出现在: ?

[gigauser@someserver ~]$ #
[gigauser@someserver ~]$ ##
[gigauser@someserver ~]$ ####
[gigauser@someserver ~]$ ####
[gigauser@someserver ~]$ : : : : : : : : : :
[gigauser@someserver ~]$ #
[gigauser@someserver ~]$ # # #
[gigauser@someserver ~]$ ####
[gigauser@someserver ~]$
[gigauser@someserver ~]$ :
[gigauser@someserver ~]$ : :
[gigauser@someserver ~]$ : : : : : : : : : : : : ::::::::
[gigauser@someserver ~]$ : : :::::
[gigauser@someserver ~]$
[gigauser@someserver ~]$
[gigauser@someserver ~]$ ::
-bash: ::: command not found
[gigauser@someserver ~]$ :::::
-bash: :::::: command not found
[gigauser@someserver ~]$
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 6

:根本不是评论,它是一个什么都不做的命令。最重要的区别在于,由于它是一个命令,因此它之后的任何 shell 语法都将被解释和执行。例如:

: Check whether x > 1
Run Code Online (Sandbox Code Playgroud)

此处该> 1部分将被解释为输出重定向,因此它将创建一个名为“1”的文件并将(空)输出重定向到该文件。如果是这样,x < 1它会尝试打开“1”进行输入并且(可能)失败。

: Check permissions on the user's home directory
Run Code Online (Sandbox Code Playgroud)

这里'将被解释为开始一个单引号字符串(这将是 的参数:),并且可能会对脚本的其余部分的解析方式造成严重破坏。

: Test for completion (again)
Run Code Online (Sandbox Code Playgroud)

生产 -bash: syntax error near unexpected token `('

:如果您希望执行参数扩展(因为它们的副作用),但不想对结果做任何事情,则该命令有时很有用。

: ${VAR:=defaultvalue}
Run Code Online (Sandbox Code Playgroud)

在这里,如果$VAR尚未设置为非空白,则:=修饰符会将其设置为“默认值”。这基本上是一个简写

if [ -z "$VAR" ]; then
    VAR=defaultvalue
fi
Run Code Online (Sandbox Code Playgroud)

编辑:

正如 AKS在评论中的链接所指出的那样,一个效果:是您可以使用它进行块评论以及带有引用分隔符的 here-document。这与#.

: Check whether x > 1
Run Code Online (Sandbox Code Playgroud)

常规注释必须以#.

(注意:与链接所说的相反,您可以在 here-doc 分隔符上使用单引号或双引号,即<'COMMENT'<"COMMENT"。如果在分隔符上没有某种引用,shell 将尝试解析和扩展任何$或它在文档中找到的反引号表达式,这会再次引起麻烦。)