代码之家  ›  专栏  ›  技术社区  ›  osexp2000

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

  •  18
  • osexp2000  · 技术社区  · 6 年前

    有人知道为什么会这样吗?这是巴什虫吗?

    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 回复  |  直到 6 年前
        1
  •  19
  •   chepner    6 年前

    未引用的右侧 == != 被视为模式,而不是文本字符串。 mnt:[4026532411] 将匹配 mnt: 紧接着就是 0、1、2、3、4、5或6,因为 移动电话:[4026532411] mnt:[0123456] 是等价的。要匹配列拉字符串,需要引用扩展。

    x='mnt:[4026532411]'
    
    [[ $x == "$x" ]] && echo OK
    
        2
  •  6
  •   larsks    6 年前

    你看到的是从 bash 手册页:

    当==和!=使用运算符,右边的字符串 该运算符被视为一个模式,并根据 下面在模式匹配下描述的规则,就像extglob 已启用外壳选项。

    你可能已经知道了, [...] 在shell中允许来自 一组字符。也就是说,给定文件:

    $ ls
    fileA fileB fileC fileD
    

    跑步 ls file[AB] 将产生:

    fileA fileB
    

    所以在你的表情里, mnt:[1234] 被解释为 时尚。