Я не верю, что это явно задокументировано, но оператор -eq
вызывает квазиарифметический контекст c для своих операндов. Обратите внимание:
$ [[ "(3 + 5)" -eq 8 ]] && echo qed
qed
Поведение переменных задокументировано в ARITHMETI C ОЦЕНКА:
Переменная оболочки, которая является нулевой или неустановленной, имеет значение 0 при обращении по имени без использования синтаксис расширения параметра.
, хотя не очевидно, что это также должно применяться к строке, являющейся результатом расширения параметра, и действительно поведение отличается в выражении арифметического c или арифметическом c сама команда:
$ unset a
$ (( a == 0 )) && echo zero
zero
$ (( $a == 0 )) && echo zero
bash: ((: == 0 : syntax error: operand expected (error token is "== 0 ")
Учитывая, что у вас уже есть $((...))
и ((...))
для арифметики c, лучше избегать -eq
и других арифметических c операторов сравнения внутри [[
; либо используйте [ "$a" -eq 0 ]
(что вызовет ошибку, если a
равно нулю или не установлено), либо используйте (( a == 0 )
.