Сравнение чисел

Тема дорожной карты · Bash

Bash предоставляет операторы для арифметического сравнения целых чисел внутри тестов [[ ]] и арифметических выражений (( )). Эти операторы включают -eq, -ne, -lt, -le, -gt и -ge — они совместимы с POSIX и используются в [ ] и [[ ]]. Внутри (( )) используются нативные операторы ==, !=, <, >, <= и >=. Важно различать числовое и строковое сравнение в Bash-скриптах. Например, использование > внутри [ ] выполняет лексикографическую сортировку, поэтому [ 9 > 10 ] вычисляется как истина. Для надёжного числового сравнения в скриптах автоматизации Linux всегда используйте -gt или арифметический контекст (( )). Конструкция (( )) удобна для составных числовых тестов, например (( count > 0 && count < 100 )), и органично интегрируется с условиями if. Для арифметики с плавающей точкой Bash не имеет нативной поддержки, поэтому рекомендуется передавать данные в awk или bc для десятичного числового сравнения. Корректное числовое сравнение — базовый навык в Bash-скриптах, предотвращающий трудноуловимые ошибки в условных конструкциях и границах циклов.

Как это работает

Сравнение чисел в Bash выполняется с помощью конструкции if cmd; then ...; elif cmd; then ...; else ...; fi, которая тестирует exit-код команды cmd. Форма [[ expr ]] (специфична для Bash и безопаснее [ expr ]) тестирует строки, файлы, числа. Распространённые тесты включают -f file, -d dir, -e exists, -z empty, -n non-empty, string == pattern (glob-match), string =~ regex. Для числового сравнения используется конструкция (( a > b )). Конструкция case ... esac используется для много-вариантной ветви.

Когда применять

[[ ]] предпочтительнее [ ] в Bash — она безопаснее (без word-splitting), поддерживает &&, ||, регулярные выражения =~. Конструкция (( )) предназначена для арифметических сравнений. case используется при трех и более ветвях, сравнивающих одно и то же значение. Всегда закавычивайте строки в [[ ]] для переносимости ([[ "$x" == "y" ]]).

Типичные ошибки

Типичные ошибки при сравнении чисел в Bash включают использование if [ $x == "y" ] с незакавыченным $x (если $x пустой, выражение становится [ == "y" ] — синтаксическая ошибка); [ ] вместо [[ ]] (разные операторы, разные правила word-splitting); = вместо == в [ ] (исторический случай — оба работают в Bash, но = более переносим).

Связанные понятия

Полезные ресурсы