bash [[[a] == [a]]] неправда? квадратная скобка влияет на результат сравнения

Кто-нибудь знает, почему это происходит? Это ошибка баха?

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

результат О мой бог

Ответы

Ответ 1

Некотированная правая часть == и != Рассматривается как шаблон, а не буквальная строка. mnt:[4026532411] будет соответствовать mnt: за ним следует ровно один из 0, 1, 2, 3, 4, 5 или 6, так как шаблоны mnt:[4026532411] и mnt:[0123456] эквивалентны. Чтобы сопоставить лирическую строку, вам нужно указать расширение.

x='mnt:[4026532411]'

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

Ответ 2

То, что вы видите, делает это предложение на странице bash man:

Когда используются операторы == и! =, Строка справа от оператора считается шаблоном и сопоставляется в соответствии с правилами, описанными ниже в разделе "Согласование шаблонов", как если бы опция оболочки extglob была включена.

Как вы уже знаете, [...] в оболочке разрешает сопоставление с группой символов. То есть, учитывая файлы:

$ ls
fileA fileB fileC fileD

Запуск ls file[AB] даст:

fileA fileB

Итак, в вашем выражении, mnt:[1234] интерпретируется аналогичным образом.