Это потому, что Bash старается преобразовать все, что вы положили в обе стороны -eq
, в целые числа, и преобразует пустую строку в ноль.Преобразования далеко не тривиальны.Вот как я ожидаю, что код анализирует числа, фактически не прочитав его:
$ [[ x -eq 0 ]] && echo "equal!"
equal!
После того, как Bash обнаруживает числовой контекст (-eq
), он начинает создавать число с нуля на левой стороне, сканирует и находитх, отбрасывает его, сканирует и находит пробелы и поэтому считает левую сторону нулевой.Следовательно, вышеупомянутое эквивалентно [[ 0 -eq 0 ]]
$ [[ 0x10 -eq 16 ]] && echo "equal!"
equal!
Начиная с нуля, Bash снова видит ноль (перед «x») и переходит в режим «альтернативной базы», находит «x» и выходитв шестнадцатеричный режим и считывает оставшиеся цифры («10») как шестнадцатеричное число.
$ [[ 00x10 -eq 16 ]] && echo "equal!"
bash: [[: 00x10: value too great for base (error token is "00x10")
После перехода в режим «альтернативной базы» после просмотра нуля Bash видит число (второй ноль),и, следовательно, переходит в режим восьмеричный .x
считается «числовым символом» в этом режиме, потому что он может использоваться в старших разрядах, но «x» не является действительной восьмеричной цифрой, поэтому он терпит неудачу.
См. Руководство по Bash для более.