BASH 评论:#(哈希)-vs- 之间的区别:(冒号)评论

BASH comments: Difference between # (hash) -vs- : (colon) commenting

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

这2个和用处有什么区别?

我注意到 # 注释使整行成为注释,而 : scope/effect 只是到达第一个 \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

在下面的代码中,为什么最后 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 ~]$

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

: Check whether x > 1

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

: Check permissions on the user's home directory

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

: Test for completion (again)

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

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

: ${VAR:=defaultvalue}

此处,如果 $VAR 尚未设置为非空值,则 := 修饰符会将其设置为“默认值”。这基本上是 shorthand for

if [ -z "$VAR" ]; then
    VAR=defaultvalue
fi

编辑:

正如 AKS 在 a link in the comments 中指出的那样,: 的一个作用是您可以使用它和带有引号分隔符的此处文档进行块注释。这与 #.

在功能上有所不同
: <<'COMMENT'
This block doesn't do anything, effectively a multi line comment block.
It'll also not get identified by linters and syntax highlighters as a comment.
COMMENT

常规注释必须以 #.

开始每一行

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