Оператор сравнения == в двойных скобках ведет себя по-разному:
[[ $foo == 0* ]] # True if $foo starts with foo "0" (wildcard matching).
[[ $foo == "0" ]] # True if $foo is equal to 0* (literal matching).
Это работает, потому что встроенный оператор [[
bash обрабатывает правую часть теста == как образец:
Когда используются операторы ==
и !=
, строка справа от оператора используется как> образец, и выполняется сопоставление с образцом.
встроенные тесты test
, равны ли строки, синтаксис [[expression]]
добавляет сравнительный тест для строковых операторов, операторы >
и <
сравнивают строки для oder (i.e :"aa" < "bb")
. оператор проверяет соответствие шаблону, а не только равенство [[ string = pattern ]]
истинно, если строка соответствует шаблону, этот оператор не является симметричным, шаблон должен появляться справа от знака равенства, т.е. [[ foo = a* ]]
истинно (= 0), тогда как [[ a* = foo ]]
ложно (= 1)
[[ "foo" == f* ]] && echo $? # 0
[[ f* == "foo" ]] && echo $? || echo $? # 1
Почему [[ $foo == $bar ]]
истинно, а [[ $bar == $foo ]]
ложно?
Оператор ==
не симметричен . Слева требуется строка, а справа - узор. Однако, если вы сделаете двойные кавычки в правой части, что удалит особое значение символов сопоставления с образцом, тогда это превратится в сравнение строк, так что [[ "$foo" == "bar" ]]
и [[ "$bar" == "$foo" ]]
эквивалентны.