Как использовать конструкцию if в Bash: практический гайд для начинающих и продвинутых
Как эффективно применять условные конструкции `if` в скриптах Bash, раскрыть нюансы синтаксиса, типы сравнения, варианты вложенности и практические кейсы.
Как эффективно применять условные конструкции
ifв скриптах Bash, нюансы синтаксиса, типы сравнения, варианты вложенности и практические кейсы.
1. Зачем нужен if в Bash?
В Bash if — это основа любой логики. С его помощью вы можете:
- Проверять наличие файлов/директорий
- Сравнивать числовые и строковые значения
- Реагировать на код завершения программ
- Управлять потоками выполнения скрипта (переключение веток)
Ниже – подробный разбор.
2. Базовый синтаксис
if CONDITION; then
# команда(ы), выполняющиеся при истинности условия
else
# команда(ы), выполняющиеся при ложности условия
fi
Что такое CONDITION?
- Команда – её код возврата (
0— true, любой другой — false). - Выражение – результат команды
test([ ... ]) или[[ ... ]]. - Группировка – несколько условий, объединенных
&&/||.
3. Условия «внутри» if
| Тип | Оператор | Пример | Описание |
|---|---|---|---|
| Строка | = / == |
[[ "$var" == "hello" ]] |
Равенство строк |
!= |
[[ "$var" != "world" ]] |
Неравенство | |
< / > |
[[ "$var" < "m" ]] |
Лексикографический порядок (с [[ только) |
|
| Число | -eq / -ne |
[ "$a" -eq 5 ] |
Равенство |
-lt / -gt |
[ "$b" -gt 10 ] |
Меньше/больше | |
-le / -ge |
[ "$c" -le 20 ] |
≤ / ≥ | |
| Файл | -e |
[ -e "$file" ] |
Файл существует |
-f |
[ -f "$file" ] |
Файл, а не директория | |
-d |
[ -d "$dir" ] |
Директория существует | |
-r, -w, -x |
[ -r "$file" ] |
Доступность (чтение/запись/исполнение) |
Tip:
[[ ... ]]более гибок, поддерживает паттерны (=~), не требует экранирования$внутри скобок.
4. Сложные выражения
4.1. Логические операторы
if [[ $a -gt 10 && $b -lt 20 ]]; then
echo "В диапазоне 10–20"
fi
&& и || работают как в C-подобных языках. Для test ([ ... ]) используйте -a и -o (но они менее читаемы).
4.2. Вложенные if
if [ -f "$file" ]; then
if grep -q "error" "$file"; then
echo "Файл содержит ошибки"
fi
fi
Можно объединить в одну строку, но читаемость падает.
4.3. Короткое условие (if [[ … ]] && command)
[[ -f "$file" ]] && echo "Файл существует" || echo "Не найден"
Плюс: экономит строку. Минус: сложнее отлаживать.
5. if с case и while
Иногда удобно комбинировать:
while read -r line; do
case "$line" in
"foo") echo "Found foo";;
"bar") echo "Found bar";;
*) echo "Other";;
esac
done < "$input"
caseпредпочтительнее, когда нужно сравнивать одну переменную со множеством паттернов.
6. Практические примеры
6.1. Проверка аргументов
#!/usr/bin/env bash
set -euo pipefail
if [[ $# -ne 2 ]]; then
echo "Usage: $0 <src> <dest>"
exit 1
fi
src=$1; dest=$2
if [[ ! -f $src ]]; then
echo "Source file not found!"
exit 2
fi
cp "$src" "$dest"
6.2. Условный запуск команд
#!/usr/bin/env bash
set -euo pipefail
if ping -c 1 google.com &>/dev/null; then
echo "Интернет доступен"
else
echo "Нет доступа"
fi
6.3. Условный вывод зависимости от кода завершения
#!/usr/bin/env bash
set -euo pipefail
some_command
status=$?
if [[ $status -eq 0 ]]; then
echo "Успешно завершено"
else
echo "Ошибка ($status)"
fi
7. Частые ошибки и ловушки
| Ошибка | Почему | Как исправить |
|---|---|---|
if [ $var == "x" ]; then |
Не экранируется $ |
[ "$var" = "x" ] |
if [[ $var < "x" ]]; then в [ ... ] |
< воспринимается как редирект |
Использовать [[ |
Неявное расширение *.txt |
Открывает все файлы, а не проверяет | [[ -e *.txt ]] может давать неожиданные результаты |
Ошибка line 3: syntax error near unexpected token |
Неправильные скобки | Проверить двойные [ ] vs [[ ]] и fi |
8. Советы по стилю
| Совет | Пример |
|---|---|
Указывать set -euo pipefail в начале скрипта |
set -euo pipefail |
| Писать явные кавычки | [[ "$var" == "value" ]] |
Избегать else при однострочных командах |
[[ -f "$file" ]] && echo "OK" |
| Комментировать сложные условия | # Проверяем, что файл не пуст и доступен для чтения |
9. Полезные ресурсы
man bash– официальная справка по синтаксису.info bash– более подробный описательный формат.cheat.sh bash– быстрый справочник в терминале.- Книга "Linux Shell Scripting Cookbook" – практические рецепты.
- Сайт
tldp.org– статьи и руководства по Bash.
10. Итоги
- Конструкция
ifв Bash – это не просто условие, а мощный инструмент для управления потоком. - Используйте
[[ … ]]для более читаемого и безопасного синтаксиса. - Не забывайте об экранировании переменных и проверке наличия файлов.
- Вложенные условия, логические операторы и комбинации
if && commandпозволяют писать компактный и эффективный код.
Попробуйте применить эти принципы в ваших скриптах: вы увидите, как ваш Bash‑код станет более надёжным и легко поддерживаемым. 🚀