Цель урока: Научить наши скрипты "думать" и принимать решения. Мы изучим, как работает фундаментальная логическая конструкция if-else, научимся проверять различные условия (существование файлов, сравнение чисел и строк) и направлять выполнение скрипта по разным веткам в зависимости от результата этих проверок.
Часть 1: Теория. Как команды сообщают об успехе или неудаче?
Чтобы понять, как работает if, нам нужно сначала понять, как любая команда в Linux сообщает системе о результате своей работы. Это очень простая и элегантная концепция.
После своего завершения каждая программа возвращает системе число - код завершения (exit code).
-
Если программа завершилась успешно, она возвращает 0.
-
Если во время работы произошла ошибка, она возвращает любое число, отличное от 0 (1, 2, 127 и т.д.).
Вы можете сами это увидеть. Введите в терминал команду, которая точно сработает:
ls /etc
А теперь сразу после нее введите специальную команду echo $?
, которая выводит код завершения последней выполненной команды:
echo $?
# Вывод будет: 0 (означает "успех")
Теперь попробуем выполнить команду, которая заведомо провалится:
ls /nonexistent_directory
# Вы увидите сообщение об ошибке

И снова проверим код завершения:
echo $?
# Вывод будет числом, отличным от 0 (например, 2), что означает "ошибка"

Конструкция if в Bash делает ровно одну вещь: она выполняет команду и смотрит на ее код завершения. Если код равен 0 (успех), выполняется один блок кода. Если нет - другой.
Часть 2: Практика. Команда test и волшебные скобки [ ... ]
Но как нам проверять условия вроде "число А больше числа Б" или "файл Х существует"? Для этого есть специальная, встроенная в Bash команда - test. Она ничего не выводит на экран, а только возвращает код завершения 0 (успех), если условие истинно, и 1 (ошибка), если оно ложно.
У команды test есть более удобный и читаемый псевдоним - [. То есть, команда test -f /etc/hosts
и команда [ -f /etc/hosts ]
- это абсолютно одно и то же.
ВАЖНО: Так как [
- это программа (или ее аналог), то пробелы вокруг нее и внутри нее - обязательны! [ -f file ]
- правильно. [-f file] - НЕПРАВИЛЬНО и вызовет ошибку.
Вот основные проверки, которые мы будем использовать:
Проверки файлов и каталогов:
-
[ -e /путь/к/файлу ]
- истина, если файл или каталог существует (exists). -
[ -f /путь/к/файлу ]
- истина, если это обычный файл (file). -
[ -d /путь/к/каталогу ]
- истина, если это каталог (directory).
Сравнение строк:
-
[ "$VAR1" = "$VAR2" ]
- истина, если строки равны. (Один знак =). -
[ "$VAR1" != "$VAR2" ]
- истина, если строки не равны. -
[ -z "$VAR" ]
- истина, если строка пустая (zero length).
Сравнение целых чисел:
-
[ $NUM1 -eq $NUM2 ]
- равно (equal). -
[ $NUM1 -ne $NUM2 ]
- не равно (not equal). -
[ $NUM1 -gt $NUM2 ]
- больше чем (greater than). -
[ $NUM1 -lt $NUM2 ]
- меньше чем (less than). -
[ $NUM1 -ge $NUM2 ]
- больше или равно (greater or equal). -
[ $NUM1 -le $NUM2 ]
- меньше или равно (less or equal).
Часть 3: Синтаксис if, else и elif
1. Простейшая конструкция if
Она выполняет блок кода, только если условие истинно.
Синтаксис:
if [ условие ]
then
# Команды, которые выполнятся, если условие истинно
fi
-
if - начинает блок.
-
then - "тогда". Обязательное слово после условия.
-
fi - (if наоборот) - закрывает весь блок if. Обязательно.
Пример: Скрипт check_root.sh, который проверяет, запущен ли он от имени root.
Напоминаем что урок по работе со скриптами (создание, запуск и т.д.) находится в - УРОКЕ НОМЕР 12.
Так что обязательно вернитесь в предыдущий урок и освежите навыки, если не уверены в своих действиях.
#!/bin/bash
# Проверяем ID текущего пользователя. У root он всегда равен 0.
# Переменная $EUID хранит ID текущего пользователя.
if [ "$EUID" -eq 0 ]
then
echo "Скрипт запущен от имени root. Отлично!"
fi
2. Конструкция if-else
Позволяет выполнить один блок кода, если условие истинно, и другой - если оно ложно.
Синтаксис:
if [ условие ]
then
# Команды для истинного условия
else
# Команды для ложного условия
fi
Пример: Улучшим наш скрипт check_root.sh.
#!/bin/bash
# Проверяем ID текущего пользователя. У root он всегда равен 0.
if [ "$EUID" -eq 0 ]
then
echo "Скрипт запущен от имени root. Продолжаем работу."
else
echo "Ошибка: скрипт должен быть запущен от имени root!"
echo "Пожалуйста, используйте 'sudo ./check_root.sh'"
fi
3. Конструкция if-elif-else
Для проверки нескольких условий по очереди.
Синтаксис:
if [ условие_1 ]
then
# Команды для условия_1
elif [ условие_2 ]
then
# Команды для условия_2
else
# Команды, если ни одно условие не подошло
fi
Пример: Скрипт guess_number.sh, который "угадывает" число, переданное как аргумент.
#!/bin/bash
# Получаем число из первого аргумента, который передали скрипту
NUMBER=$1
MY_NUMBER=10
echo "Вы ввели число: $NUMBER"
if [ "$NUMBER" -gt "$MY_NUMBER" ]
then
echo "Это число больше моего."
elif [ "$NUMBER" -lt "$MY_NUMBER" ]
then
echo "Это число меньше моего."
else
echo "Вау! Вы угадали мое число!"
fi
Как запустить:
./guess_number.sh 7
./guess_number.sh 15
./guess_number.sh 10
Итоги урока и домашнее задание
-
Что мы освоили:
-
Принцип работы кодов завершения (0 = успех, не 0 = ошибка).
-
Как конструкция
if
использует коды завершения для принятия решений. -
Назначение команды test и ее псевдонима [ ... ].
-
Важнейшее правило: обязательные пробелы внутри [ ... ].
-
Три основные формы условного оператора:
if, if-else и if-elif-else
. -
Как проводить базовые проверки файлов, строк и чисел.
-
-
Ваше тринадцатое задание:
Ваша задача - написать скрипт check_nginx.sh, который будет проверять, установлен ли на сервере веб-сервер Nginx. Мы будем считать, что если существует каталог /etc/nginx, то Nginx установлен.Требования к скрипту:
-
Создайте файл check_nginx.sh в вашей папке ~/scripts.
-
Не забудьте про шебанг #!/bin/bash в первой строке.
-
Используйте конструкцию if-else для проверки.
-
Условием для if должна быть проверка на существование каталога /etc/nginx. Используйте для этого ключ -d.
-
Если каталог существует, скрипт должен вывести на экран сообщение: "Nginx установлен в системе."
-
Если каталог не существует, скрипт должен вывести: "Nginx не найден."
-
Сделайте скрипт исполняемым с помощью команды chmod +x.
-
Запустите скрипт и проверьте его работу. Затем установите Nginx (apt install nginx), запустите скрипт еще раз и посмотрите, как изменился его вывод. После этого можете удалить Nginx (apt purge nginx).
-
На следующем уроке мы изучим циклы (for и while), которые позволят нашим скриптам выполнять повторяющиеся действия, например, обрабатывать список файлов или работать до тех пор, пока не будет выполнено определенное условие.
Перейти к просмотру - УРОК №14.
Промо-код: PROMO15 - скидка 15%!
Введите при оформлении первого заказа на сайте: Hosting-VDS.com