Переменные, условия и циклы для автоматизации задач
В прошлых модулях вы освоили базовые команды Linux и научились управлять системой. Теперь пора двигаться дальше: автоматизировать рутинные задачи. Здесь на помощь приходит Bash-скриптинг — мощный инструмент, который превратит последовательность команд в исполняемый сценарий.
Что такое Bash-скриптинг и зачем он DevOps-инженеру?
Bash-скриптинг — это написание сценариев (скриптов) для командной оболочки Bash (Bourne Again SHell). Она стандартна для большинства дистрибутивов Linux. Скрипты автоматизируют повторяющиеся задачи:
- Резервное копирование данных: Создают архивы и перемещают их в удалённое хранилище.
- Установка и настройка ПО: Разворачивают приложения и их зависимости.
- Мониторинг системы: Проверяют состояние сервисов, свободное место на диске, загрузку CPU.
- Управление файлами: Сортируют, переименовывают, удаляют файлы по заданным критериям.
- Развёртывание приложений: Автоматизируют шаги деплоя на серверы.
Для DevOps-инженера умение писать Bash-скрипты — это фундамент для создания сложных систем автоматизации и CI/CD пайплайнов. Это ваш первый шаг к тому, чтобы перестать выполнять одни и те же действия вручную и начать мыслить категориями «инфраструктура как код» (IaC).
Переменные: храним данные в скриптах
Переменные в Bash хранят значения, которые меняются в процессе выполнения скрипта. Это делает скрипты гибкими и многоразовыми.
Объявление и использование переменных
Чтобы объявить переменную, просто присвойте ей значение:
NAME="Михаил"
AGE=30
PATH_TO_LOGS="/var/log/app"
Важно: Между именем переменной, знаком
=и значением не должно быть пробелов.
Для доступа к значению переменной используйте знак $ перед её именем:
echo "Привет, $NAME! Тебе $AGE лет."
echo "Логи находятся здесь: $PATH_TO_LOGS"
Пример: Создадим скрипт hello.sh, который приветствует пользователя.
- Создайте файл:
nano hello.sh - Добавьте содержимое:
#!/bin/bash # Это комментарий. Все, что начинается с #, игнорируется. USER_NAME="Пользователь" echo "Привет, $USER_NAME!" # Можно запросить ввод у пользователя read -p "Как вас зовут на самом деле? " REAL_NAME echo "Очень приятно, $REAL_NAME!" - Сделайте скрипт исполняемым:
chmod +x hello.sh - Запустите:
./hello.sh
Специальные переменные
Bash предоставляет несколько полезных встроенных переменных:
$0: Имя текущего скрипта.$1,$2, ...: Позиционные параметры, переданные скрипту.$#: Количество переданных параметров.$@: Все переданные параметры как отдельные строки.$*: Все переданные параметры как одна строка.$?: Код выхода последней выполненной команды (0 – успех, >0 – ошибка).
Пример: Скрипт args.sh для работы с аргументами.
#!/bin/bash
echo "Имя скрипта: $0"
echo "Количество аргументов: $#"
echo "Первый аргумент: $1"
echo "Второй аргумент: $2"
echo "Все аргументы как отдельные строки: $@"
echo "Все аргументы как одна строка: $*"
Запустите: ./args.sh alpha beta gamma
Условия: принимаем решения в скриптах
Условные конструкции позволяют скриптам выполнять разные действия в зависимости от выполнения условий.
Конструкция if-then-else
Базовая структура:
if [ условие ]; then
# Команды, если условие истинно
elif [ другое_условие ]; then
# Команды, если другое_условие истинно
else
# Команды, если ни одно из условий не истинно
fi
Важно: Пробелы вокруг квадратных скобок
[]и внутри них обязательны!
Операторы сравнения
Для числовых сравнений:
-eq: равно-ne: не равно-gt: больше-ge: больше или равно-lt: меньше-le: меньше или равно
Для строковых сравнений:
==или=: равно!=: не равно<: меньше (лексикографически)>: больше (лексикографически)-z: строка пуста-n: строка не пуста
Для проверки файлов и каталогов:
-f: файл существует и является обычным файлом-d: файл существует и является каталогом-e: файл или каталог существует-r: файл доступен для чтения-w: файл доступен для записи-x: файл доступен для выполнения
Пример: Скрипт check_file.sh, который проверяет наличие файла.
#!/bin/bash
FILE_NAME="test.txt"
if [ -f "$FILE_NAME" ]; then
echo "Файл '$FILE_NAME' существует."
if [ -w "$FILE_NAME" ]; then
echo "Файл '$FILE_NAME' доступен для записи."
else
echo "Файл '$FILE_NAME' не доступен для записи."
fi
else
echo "Файл '$FILE_NAME' не существует. Создаем его..."
touch "$FILE_NAME"
echo "Файл '$FILE_NAME' создан."
fi
Циклы: повторяем действия
Циклы позволяют выполнять блок команд многократно.
Цикл for
Используется для итерации по списку элементов.
for ITEM in элемент1 элемент2 элемент3; do
# Команды, использующие $ITEM
done
Можно также использовать генерацию последовательностей: for i in {1..5}; do ... done
Пример: Скрипт backup_dirs.sh, который создаёт резервные копии нескольких каталогов.
#!/bin/bash
DIRS_TO_BACKUP="/home/user/docs /var/www/html /etc/nginx"
BACKUP_DIR="/tmp/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
for DIR in $DIRS_TO_BACKUP; do
if [ -d "$DIR" ]; then
ARCHIVE_NAME="$(basename "$DIR")_$DATE.tar.gz"
echo "Создаем резервную копию $DIR в $BACKUP_DIR/$ARCHIVE_NAME"
tar -czf "$BACKUP_DIR/$ARCHIVE_NAME" "$DIR"
else
echo "Каталог $DIR не существует, пропускаем."
fi
done
echo "Резервное копирование завершено."
Цикл while
Выполняет блок команд, пока условие истинно.
while [ условие ]; do
# Команды
done
Пример: Скрипт countdown.sh, который отсчитывает время.
#!/bin/bash
COUNT=5
while [ $COUNT -gt 0 ]; do
echo "Осталось $COUNT..."
sleep 1 # Ждем 1 секунду
COUNT=$((COUNT - 1)) # Уменьшаем счетчик
done
echo "Старт!"
Совет: Используйте
sleepв циклах для задержки выполнения. Это полезно при ожидании готовности сервисов или при работе с API, имеющими ограничения по частоте запросов.
Практическое задание: мониторинг свободного места
Создайте Bash-скрипт disk_monitor.sh, который:
- Принимает один аргумент — пороговое значение свободного места на диске в процентах (например, 20).
- Получает информацию о свободном месте на корневом разделе
/с помощью командыdf -h /. - Извлекает процент использования диска.
- Если процент использования диска превышает заданный порог, выводит предупреждение.
- Если процент использования диска ниже порога, выводит сообщение, что всё в порядке.
Подсказка: Используйте awk или sed для извлечения нужного значения из вывода df. Например: df -h / | awk 'NR==2 {print $5}' | sed 's/%//'
Поздравляю! Вы сделали первый уверенный шаг в мир автоматизации с помощью Bash-скриптинга. Переменные, условия и циклы — это строительные блоки, которые позволят вам создавать мощные и гибкие сценарии.
В следующем разделе мы углубимся в работу с файлами и обработку ошибок в скриптах, что сделает ваши автоматизированные решения ещё более надёжными и функциональными. Готовы ли вы сделать свои скрипты по-настоящему устойчивыми?