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


9

Bash手册说:

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

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

因此,]它不是保留字,也不是运算符,也不是内置命令。

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


4
实际上,这[也是(也是)一个自我维持的命令:-rwxr-xr-x 1 root root 39552 Dec 3 18:14 / usr / bin / [尽管有可能还内置了“ parallel”,例如例如kill。在某些系统上,该test命令是指向的符号链接,[反之亦然。AFAIK ]本身并不意味着任何东西,但是可以“关闭”一个[-而是出于“审美”的原因。
Baard Kopperud

5
在过去的46年中,shell语言层层发展,而内部一致性从来都不是优先考虑的问题。如果您试图将其强加于任何形式的理论形式语言框架中,那将是一段糟糕的时光。
zwol

由于[(也是)一个自包含的命令,因此通常会得到一个手册页...因此,请尝试man [和/或man test[并且test可能是同一命令)。
Baard Kopperud

尝试]用单引号或双引号引起来,您将发现它没有区别;这只是一个字符串。
通配符

Answers:


21

]补充[,它是[命令的结束标志。

正如man页面所指出的,这实际上是的参数[,但[碰巧将其视为结尾。

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


谢谢。什么是令牌类型/标识符]
蒂姆(Tim)

8
@Tim ]在这种情况下(作为命令的参数)与任何其他普通字符没有区别。该test命令会对其进行特殊处理,但这取决于命令。
muru

6
它只是一个字符串,[如果其最终参数不完全等于,则会引发错误]
chepner

19

Bash不会将[]字符(本身)与字母区别对待。

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

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

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


例外情况

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

1
@JacobKrall这不是像;or >这样的特殊字符,它只是像的内置命令cd。特别是,如果键入[x[则没有特殊含义。
Barmar

2
@JacobKrall对于所有内置命令都是如此。[是特殊命令,不是特殊字符
Barmar

@Barmar:足够公平;我撤回我的评论。
雅各布·克拉尔

其实]]]。使用时[]它们只是文字。如果省略]或将其替换为其他单词,bash仍将运行[,但[会产生错误。但是[[]]在解析时会被特殊对待。如果]]用其他替换,bash将报告语法错误。如果您忽略了]]bash,它将继续解析下一行以查找]]
卡巴斯德(Kasperd)'16

@kasperd答案已调整。
ams

3

比前面两个答案更简单地说,]它只是一个[需要运行的字符串。


1
这似乎有点像评论...
wizzwizz4 2016年

@ wizzwizz4,考虑到OP中的后续问题,我认为这种简单正是他所需要的。
通配符

@Wildcard我实际上同意。有一些吸引我支持此答案的东西,但我认为它的质量很低。(虽然没有投票!)我将进行编辑以改善标记。
wizzwizz4 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.