Странные результаты сравнения - PullRequest
1 голос
/ 14 июня 2019

У меня проблемы с bash:

Ожидается:

[[ 0 -eq 0 ]] && echo "equal!"
> equal!

Это не:

[[ "" -eq 0 ]] && echo "equal!"
> equal!

Почему "" равно 0?

Как проверить числовое равенство?

1 Ответ

0 голосов
/ 15 июня 2019

Это потому, что 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 для более.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...