有人知道为什么会这样吗?这是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
结果是我的天哪
答案 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]
的解释与
时尚。