Введение
Представьте, что вы ведёте автомобиль по GPS-навигатору. GPS не просто выдаёт один список инструкций — он реагирует на дорожную ситуацию. Если на дороге пробка, он прокладывает новый маршрут. Если вы пропустили поворот, он пересчитывает маршрут.
В скриптах это называется условной логикой. Без неё скрипт представляет собой лишь последовательность команд, выполняемых вслепую. С условной логикой скрипт может проверить текущую ситуацию и выбрать, что делать дальше.
Это одна из основ надёжной автоматизации. Реальные системы не всегда находятся в одном и том же состоянии, поэтому хорошие скрипты должны реагировать на ситуацию, а не делать предположения.
В этой лабораторной работе вы добавите «мозг» своим скриптам с помощью if и else.
Вы научите скрипт:
- Проверять реальное состояние: выяснять, существует ли файл, прежде чем пытаться его открыть.
- Принимать решения: выполнять одно действие, если ответ «да», и другое, если ответ «нет».
- Проверять идентификатор: определять, есть ли у пользователя права (Root) для запуска скрипта.
Проверка существования файла
Хороший скрипт действует как внимательный водитель: сначала смотрит, а потом делает шаг. Одна из самых распространённых проверок в Linux звучит так: «Существует ли этот файл?»
Для этого внутри блока if используется флаг -f (проверка файла). Представляйте if как охранника. Он пропускает код внутри блока только в том случае, если условие выполнено.
Это ваш первый настоящий пример того, как скрипт принимает решение на основе состояния системы. Это важный переход от подхода «выполнить команды по порядку» к подходу «проверить окружение, а затем выбрать действие». Именно на этом шаблоне построена значительная часть административных скриптов.
Сначала перейдите в папку проекта:
cd ~/project
Создайте новый скрипт с именем check_file.sh:
nano check_file.sh
Введите следующий код. Он проверяет, существует ли data.txt.
#!/bin/bash
FILE="data.txt"
if [ -f "$FILE" ]; then
echo "$FILE exists."
fi
Разбор логики:
if [ ... ]; then: условие-«охранник». Оно задаёт вопрос внутри квадратных скобок.-f "$FILE": сам вопрос — «Является лиdata.txtсуществующим обычным файлом?»echo ...: действие. Оно выполняется только тогда, когда «охранник» отвечает «да».fi: «завершить if». Эта команда сообщает Linux, что условный блок закончен.
Форма со скобками [ ... ] — распространённый способ выполнить проверку в Bash. В данном случае проверяется свойство файла. Linux и Bash предоставляют множество подобных операторов проверки. Изучив их, вы сможете обрабатывать в скриптах файлы, строки, числа и права доступа.
Сохраните файл (Ctrl+O) и выйдите (Ctrl+X).
Сделайте скрипт исполняемым:
chmod +x check_file.sh
Тест 1: невидимый файл
Запустите скрипт:
./check_file.sh
Ничего не произойдёт. Терминал останется без вывода.
Почему? Файл data.txt не существует. «Охранник» ответил «нет», поэтому команда echo была полностью пропущена.
Тест 2: существующий файл
Теперь создайте файл:
touch data.txt
Снова запустите скрипт:
./check_file.sh
Теперь «охранник» отвечает «да», и вы увидите:
data.txt exists.
Добавление блока else
Отсутствие вывода сбивает с толку. Если скрипт ничего не делает, непонятно, завершился ли он успешно или просто закончил работу. Нам нужен запасной план.
В логике это называется «развилкой».
- Ветка A (if): файл существует. Всё хорошо.
- Ветка B (else): файл отсутствует. Нужно это исправить.
Изменим скрипт так, чтобы он автоматически создавал отсутствующий файл.
Сначала удалите тестовый файл, чтобы выполнить настоящую проверку:
rm data.txt
Откройте скрипт:
nano check_file.sh
Добавьте блок else, как показано ниже:
#!/bin/bash
FILE="data.txt"
if [ -f "$FILE" ]; then
echo "$FILE exists."
else
echo "$FILE does not exist. Creating it now..."
touch "$FILE"
fi
Логика:
Если условие if истинно → выполните первую часть.
Если условие if ложно → выполните часть else.
Такой скрипт часто ближе к реальной операционной работе, чем скрипт, который только выводит информацию. Он не просто сообщает об отсутствии чего-либо, а исправляет ситуацию. Поэтому условная логика лежит в основе многих скриптов настройки и обслуживания.
Сохраните файл и выйдите из редактора.
Проверка логики
Запустите скрипт. Файл data.txt отсутствует, поэтому должна выполниться ветка B:
./check_file.sh
Вывод:
data.txt does not exist. Creating it now...
Сразу запустите скрипт ещё раз. Теперь data.txt существует, поэтому должна выполниться ветка A:
./check_file.sh
Вывод:
data.txt exists.
Теперь ваш скрипт стал «идемпотентным». Это означает, что его можно запустить 100 раз, и он каждый раз будет обеспечивать правильный результат — наличие файла — без аварийного завершения.
Это слово часто используется в DevOps. Идемпотентное действие можно безопасно повторять, потому что важнее конечное состояние, чем количество запусков команды. Благодаря этому автоматизация становится надёжнее, особенно когда задания запускаются повторно после сбоя.
Проверка прав Root
Некоторые двери в Linux заперты. Ключ от них есть только у суперпользователя (Root). Если запустить скрипт обслуживания системы от имени обычного пользователя, он завершится с ошибкой «Permission Denied».
Умный скрипт проверяет ваш идентификатор до попытки открыть такую дверь.
В Linux у каждого пользователя есть числовой идентификатор (UID).
- Root всегда имеет UID 0.
- У обычных пользователей UID обычно начинается с 1000.
Напишем скрипт, который проверяет ваш идентификатор.
Создайте файл check_root.sh:
nano check_root.sh
Введите следующий код:
#!/bin/bash
if [ "$UID" -eq 0 ]; then
echo "You are running this script as root."
else
echo "You are running this script as a regular user."
fi
Разбор:
$UID: переменная, содержащая ваш текущий числовой идентификатор.-eq: оператор «равно» для чисел. Для сравнения слов используется=, а для чисел —-eq.
Это ещё один пример синтаксиса проверок. При сравнении чисел внутри [ ... ] Bash использует такие операторы, как -eq, -ne, -lt и -gt. Они отличаются от операторов сравнения строк, потому что оболочке нужно понимать, сравнивает ли она слова или числовые значения.
Сохраните файл и выйдите из редактора. Сделайте скрипт исполняемым:
chmod +x check_root.sh
Проверка
Вы вошли в систему как labex, поэтому вы являетесь обычным пользователем.
Запустите скрипт обычным способом:
./check_root.sh
Скрипт видит ненулевой идентификатор и выводит:
You are running this script as a regular user.
Теперь воспользуемся правами суперпользователя с помощью sudo:
sudo ./check_root.sh
sudo изменяет ваш идентификатор на 0 только для выполнения этой команды. Скрипт замечает это и выводит:
You are running this script as root.
Так работают профессиональные скрипты установки: они отказываются запускаться, если вы не Root!
Цель не в том, чтобы требовать права Root для каждой операции, а в том, чтобы проверять права перед выполнением защищённых действий. Хорошо написанный скрипт сразу завершается с понятным объяснением, вместо того чтобы выполнить только часть работы и позже выдать непонятные ошибки доступа.
Итоги
Теперь у ваших скриптов появился «мозг»!
В этой лабораторной работе вы научились:
- Использовать «охранника» (
if): задавать вопросы вроде «Существует ли этот файл?» с помощью-f. - Создавать развилку (
else): задавать запасной план, если ответ — «нет». - Проверять идентификатор: использовать сравнение чисел (
-eq) для проверки прав пользователя.
Теперь ваши скрипты — это не просто списки команд. Это интеллектуальные программы, которые адаптируются к окружению.



