bash [[[a] == [a]]]不是真的吗?方括号影响比较结果

ose*_*003 19 bash string-comparison

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

x='mnt:[4026532411]'

[[ $x == $x ]] && echo OK
Run Code Online (Sandbox Code Playgroud)

我期待结果OK,但事实并非如此.

当然,这是有效的

[[ "$x" == "$x" ]] && echo OK
Run Code Online (Sandbox Code Playgroud)

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

x='a b'
[[ $x == $x ]] && echo OK
Run Code Online (Sandbox Code Playgroud)

作品.

讽刺的是

x='mnt:[4026532411]'

[[ $x != $x ]] && echo Oh my god
Run Code Online (Sandbox Code Playgroud)

结果是我的天啊

che*_*ner 19

不带引号的右侧==!=被视为模式,而不是文字字符串.mnt:[4026532411]将匹配mnt:后紧跟一个的0,1,2,3,4,5,或6,由于图案mnt:[4026532411]mnt:[0123456]是相等的.要匹配连接字符串,您需要引用扩展.

x='mnt:[4026532411]'

[[ $x == "$x" ]] && echo OK
Run Code Online (Sandbox Code Playgroud)

  • @Mehrdad不完全.引用`[`是为了对抗分词.这就是人们提到`[[`不需要引号时)所指的内容.在chepner的回答中,左侧的未加引号的"$ x"非常好 - 它不需要那里的引号.但同样,还有不同的问题 - "[`将"=="的右侧视为模式.所以......上下文很重要,我想 (2认同)

lar*_*sks 6

你看到的是从bash手册页做这句话:

当使用==和!=运算符时,运算符右侧的字符串被视为模式,并根据模式匹配下面描述的规则进行匹配,就像启用了extglob shell选项一样.

您可能已经知道,[...]在shell中允许从一组字符进行匹配.也就是说,给定文件:

$ ls
fileA fileB fileC fileD
Run Code Online (Sandbox Code Playgroud)

跑步ls file[AB]会产生:

fileA fileB
Run Code Online (Sandbox Code Playgroud)

所以在你的表达中,mnt:[1234]以类似的方式解释.