test и [[ ]]

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

Встроенная команда test и её сокращённая форма [ ] — традиционный POSIX-совместимый способ вычислять условия в Bash и других оболочках Linux, тогда как расширенная ключевая конструкция [[ condition ]] является Bash-специфичным улучшением, добавляющим сопоставление шаблонов, поддержку регулярных выражений через =~ и более безопасную обработку пустых переменных. В отличие от [ ], конструкция [[ ]] не выполняет разбиение слов и подстановку имён файлов по операндам, что устраняет целый класс распространённых ошибок в shell-скриптах, когда значения переменных содержат пробелы или специальные символы. Как test, так и [[ ]] возвращают статус завершения 0 для истины и 1 для лжи, органично интегрируясь с if, while и цепочками &&/|| в скриптах автоматизации Bash. Сравнение строк внутри [[ ]] использует операторы == и !=, тогда как арифметические сравнения применяют операторы -eq, -lt, -gt и аналогичные, совместимые со встроенной командой test. Понимание того, когда использовать test, [ ] или [[ ]], — необходимые знания для написания корректной и переносимой логики условий в shell-скриптах на системах Linux.

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

test и [[ ]]: if cmd; then ...; elif cmd; then ...; else ...; fi — тестирует exit-код cmd. Bracket-форма [[ 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), поддерживает &&, ||, regex =~. (( )) — для арифметических сравнений. case — при 3+ ветвях, сравнивающих то же значение. Всегда закавычивайте строки в [[ ]] для переносимости ([[ "$x" == "y" ]]).

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

Ловушки test и [[ ]]: if [ $x == "y" ] с незакавыченным $x (если $x пустой, выражение становится [ == "y" ] — syntax error); [ ] где имели в виду [[ ]] (разные операторы, разные правила word-splitting); = vs == в [ ] (исторический случай — оба работают в bash, но = переносимее).

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

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