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]
интерпретируется аналогичным образом.