bash [[[a] == [a]]]不正确吗?方括号影响比较结果

时间:2018-06-23 15:58:04

标签: bash string-comparison

有人知道为什么会这样吗?这是bash的错误吗?

x='mnt:[4026532411]'

[[ $x == $x ]] && echo OK

我期望结果为OK,但没有。

当然可以,

[[ "$x" == "$x" ]] && echo OK

但是据我所知,bash [[]]的优点是比较时不需要引用var。

x='a b'
[[ $x == $x ]] && echo OK

有效。

讽刺的事情是

x='mnt:[4026532411]'

[[ $x != $x ]] && echo Oh my god

结果是我的天哪

2 个答案:

答案 0 :(得分:18)

==!=的右引号被视为模式,而不是文字字符串。 mnt:[4026532411]将与mnt:匹配,后跟精确的 one 分别为0、1、2、3、4、5或6,因为模式mnt:[4026532411]和{{ 1}}是等效的。要匹配字符串,您需要引用扩展名。

mnt:[0123456]

答案 1 :(得分:6)

您所看到的是在bash手册页中执行以下语句:

  

使用==和!=运算符时,其右侧的字符串   运算符被认为是一种模式,并根据   规则在“模式匹配”下描述,就像extglob   Shell选项已启用。

您可能已经知道,外壳程序中的[...]允许从 字符组。也就是说,给定文件:

$ ls
fileA fileB fileC fileD

运行ls file[AB]将产生:

fileA fileB

因此,在您的表达式中,mnt:[1234]的解释与 时尚。