`]` 的令牌标识符是什么?

Tim*_*Tim 9 bash

Bash手册说:

当使用 [ 形式时,命令的最后一个参数必须是 ]。

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found
Run Code Online (Sandbox Code Playgroud)

所以]不是保留字,也不是运算符,也不是内置命令。

作为令牌, 的令牌标识符是]什么?单词还是名字?

hee*_*ayl 21

]补充[,它是[命令的结束符号。

正如man页面所指出的,这实际上是 的一个论点[,但[碰巧将其特别视为结尾。

您可以将其与其他一些命令关闭模式类似,例如;find .. exec.

  • @Tim `]` 与此上下文中的任何其他普通字符没有区别(作为命令的参数)。`test` 命令对其进行了特殊处理,但这取决于命令。 (8认同)
  • 它只是一个字符串,如果它的最后一个参数不完全等于 `]`,`[` 会引发一个错误。 (6认同)

ams*_*ams 19

Bash 不会将[]字符(单独)视为与字母表中的字母有任何不同。

在这种情况下,bash 看到一个“词”,[,并寻找具有该名称的命令。如果您查看您的文件系统,您可能会发现/bin/[(或/usr/bin/[)作为可执行文件存在。碰巧的是,bash 还提供了一个内置版本(为了效率),但这只是一个实现细节。

[命令(如具有该名称的可执行文件)有一个规则,即您传递给它的最后一个参数应该是],否则它会引发错误。这可能部分是因为它在美学上令人愉悦,但它还可以保护您免受意外截断的命令的影响,这很好。

这些并不特殊的事实就是为什么您不能省略[or前后的空格]


例外

  • []以正确的格式出现在同一个单词中时,例如[a-z],那么这特殊的并且 bash 的通配规则适用。
  • [[命令特殊,可以做很多不能做的事情[(并且内部参数[[ .. ]]的处理方式不同,一些换行符也是如此)。对应]]的也是特殊的,因为它是一个shell保留字,不能作为命令名,终止跟在[[关键字后面的特殊处理。

  • @JacobKrall 对于所有内置命令都是如此。`[` 是一个特殊的**命令**,它不是一个特殊的**字符**。 (2认同)