Условные конструкции
Тема дорожной карты · Bash
Условные конструкции в Bash позволяют shell-скриптам принимать решения на основе проверки файлов, сравнения строк и арифметических вычислений, используя шаблоны if [[ condition ]]; then ... fi или сокращённую форму command && on_success || on_failure. Двойные скобки [[ ]] — это Bash-специфичная конструкция, поддерживающая сопоставление шаблонов с ==, сопоставление с регулярными выражениями с =~ и логические операторы && и || без необходимости дополнительного экранирования, что делает её безопаснее POSIX-команды [ ] в сложных скриптах. Операторы проверки файлов, такие как -f, -d, -r, -z и -s, позволяют скриптам Bash на Linux проверять, существует ли путь, является ли он директорией, доступен ли он для чтения или непустой, прежде чем выполнять действия. Арифметические условия лучше всего выражать с помощью (( n > 0 )), что возвращает код завершения true/false, совместимый с конструкциями if и while в скриптах автоматизации. Освоение условных конструкций Bash — включая сравнение строк ([[ "$a" == "$b" ]]), проверку на пустую строку ([[ -z "$var" ]]) и составные условия ([[ -f "$f" && -r "$f" ]]) — является основой для написания надёжной автоматизации командной строки Linux.
Как это работает
Условные конструкции: 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" ]]).
Типичные ошибки
Ловушки Условные конструкции: if [ $x == "y" ] с незакавыченным $x (если $x пустой, выражение становится [ == "y" ] — syntax error); [ ] где имели в виду [[ ]] (разные операторы, разные правила word-splitting); = vs == в [ ] (исторический случай — оба работают в bash, но = переносимее).