Искусство написания скриптов

LinuxAdvanced
Практиковаться сейчас

Введение

Добро пожаловать, будущий системный администратор! Вы только что устроились в оживленную технологическую компанию на должность младшего DevOps-инженера. Ваш старший коллега ушел в заслуженный отпуск, и на ваш стол легла критически важная задача. Основной сервер приложений генерирует огромное количество лог-файлов, которые стремительно заполняют дисковое пространство. Ваша миссия, если вы решите ее принять, — стать Мастером скриптов (The Script Artisan).

Вам необходимо создать автоматизированный shell-скрипт для управления этими лог-файлами. Речь идет не просто о запуске нескольких команд, а о создании надежного и многоразового инструмента. Вы начнете с простого скрипта и постепенно добавите в него такие функции, как переменные, ввод данных пользователем, проверка ошибок и циклы. К концу этого задания вы создадите скрипт, способный выполнять резервное копирование и управление файлами, доказав свою ценность для команды и спасая ситуацию!

Приступим к написанию скриптов!

Важное примечание
Предстоящие задания могут выходить за рамки курса Быстрый старт с Linux.
Если вы столкнулись с трудностями во время выполнения задания:
  1. Временно пропустите задание и продолжите выполнение последующих практических лабораторных работ в пути обучения Linux.
  2. Обсудите проблему с Labby или посмотрите решение.

Написание простого shell-скрипта

Ваша первая задача — заложить фундамент. Каждый великий скрипт начинается с одной строки. Вам нужно создать файл скрипта и добавить базовую команду, чтобы убедиться, что все работает правильно. Этот начальный шаг подтвердит, что ваша среда настроена верно и вы готовы к созданию более сложной логики.

Задачи

  • Создайте новый файл shell-скрипта с именем log_manager.sh в директории ~/project.
  • Добавьте «shebang»-строку (#!/bin/bash) в самом верху скрипта. Она указывает системе, какой интерпретатор использовать.
  • Добавьте команду для вывода сообщения "Log Manager Initialized." на экран.
  • Сделайте скрипт исполняемым с помощью команды chmod +x.

Требования

  • Скрипт должен называться log_manager.sh.
  • Скрипт должен находиться в директории ~/project.
  • Первая строка должна быть #!/bin/bash.
  • Скрипт должен использовать команду echo для отображения требуемого сообщения.
  • Скрипт должен иметь права на выполнение (используйте chmod +x log_manager.sh).

Примеры

После создания и предоставления прав на выполнение, весь процесс должен выглядеть так:

Сначала проверьте, существует ли файл скрипта:

ls ~/project/
log_manager.sh

Установите права на выполнение для скрипта:

chmod +x ~/project/log_manager.sh

Теперь запустите скрипт:

./log_manager.sh

Скрипт должен вывести:

Log Manager Initialized.

Вы также можете проверить содержимое скрипта:

cat ~/project/log_manager.sh

Файл должен содержать:

#!/bin/bash

echo "Log Manager Initialized."

Подсказки

  • Вы можете использовать текстовый редактор командной строки, например nano, для создания и редактирования файла. Например: nano log_manager.sh.
  • Команда echo используется для вывода строки текста.
  • Используйте chmod +x filename, чтобы сделать скрипт исполняемым. Флаг +x добавляет права на выполнение для владельца файла.

Добавление переменных и пользовательского ввода

Скрипт с жестко заданными параметрами не очень гибок. Чтобы сделать ваш скрипт более динамичным и пригодным для повторного использования, теперь вы введете переменные. Вы определите переменную для директории логов и запросите у пользователя метку для запуска резервного копирования. Это сделает скрипт адаптируемым к различным ситуациям без изменения самого кода.

Задачи

  • Измените ваш скрипт log_manager.sh.
  • Определите переменную с именем LOG_DIR и присвойте ей путь /home/labex/project/app_logs.
  • Добавьте строку для вывода "Enter the backup filename: ", чтобы запросить ввод у пользователя.
  • Используйте команду read для сохранения ввода пользователя в новую переменную BACKUP_FILENAME.
  • Добавьте финальную команду echo для подтверждения настроек, выводя сообщение вида "Backing up logs to: [filename]", где [filename] — это значение, введенное пользователем.

Требования

  • Скрипт должен содержать переменную LOG_DIR, установленную в /home/labex/project/app_logs.
  • Скрипт должен использовать команду read для получения ввода от пользователя.
  • Ввод пользователя должен сохраняться в переменной BACKUP_FILENAME.
  • Финальный вывод должен использовать переменную $BACKUP_FILENAME.

Примеры

При запуске измененного скрипта он должен запросить ввод и отобразить сообщение с подтверждением. Взаимодействие должно выглядеть так:

./log_manager.sh
Log Manager Initialized.
Enter the backup filename: daily_backup
Backing up logs to: daily_backup

Скрипт должен приостановиться на строке "Enter the backup filename:", ожидая, пока пользователь введет имя и нажмет Enter. После ввода скрипт отображает сообщение с подтверждением, используя введенное значение. В этом задании это значение является меткой запуска, отображаемой в выводе, в то время как само действие резервного копирования будет реализовано на шаге 4 путем копирования файлов .log в ~/project/backups.

Подсказки

  • Для определения переменной используйте синтаксис VARIABLE_NAME="value". Вокруг знака = не должно быть пробелов.
  • Чтобы использовать значение переменной, добавьте перед ее именем знак $, например $MY_VARIABLE.
  • Команда read приостанавливает выполнение скрипта и ждет, пока пользователь что-то введет и нажмет Enter.

Реализация условной логики

Хороший скрипт предвидит проблемы. Что произойдет, если указанная вами директория логов не существует? Скрипт завершится с ошибкой. Чтобы сделать ваш скрипт более надежным, нужно добавить условную логику. Вы будете использовать оператор if для проверки существования директории логов перед выполнением любых операций.

Задачи

  • Измените ваш скрипт log_manager.sh.
  • Добавьте оператор if для проверки того, существует ли директория, указанная в переменной $LOG_DIR.
  • Если директория существует, скрипт должен продолжить работу как раньше (запросить имя файла и т.д.).
  • Если директория не существует, скрипт должен вывести сообщение об ошибке "Error: Log directory not found." и немедленно завершиться с ненулевым кодом выхода.

Требования

  • Скрипт должен использовать оператор if.
  • Условие должно проверять существование директории с помощью оператора проверки -d.
  • Если директория не существует, скрипт должен вывести указанное сообщение об ошибке с помощью echo.
  • Если директория не существует, скрипт должен завершиться с помощью exit 1.

Примеры

Если директория логов существует, скрипт должен работать нормально:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: test_backup.tar.gz
Backing up logs to: test_backup.tar.gz

Если директория логов не существует, скрипт должен вывести ошибку и завершиться:

./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.

В этом случае скрипт завершается сразу после вывода сообщения об ошибке, не запрашивая ввод пользователя и не выполняя никаких операций резервного копирования.

Подсказки

  • Синтаксис базового оператора if: if [ condition ]; then ... else ... fi.
  • Проверка [ -d "$DIRECTORY_PATH" ] возвращает истину, если $DIRECTORY_PATH существует и является директорией.
  • exit 1 — это стандартный способ сигнализировать о том, что скрипт завершился с ошибкой.

Циклическая обработка файлов

Теперь переходим к самой сути автоматизации! Вам нужно обработать файлы внутри директории логов. Вы будете использовать цикл for для перебора всех файлов, заканчивающихся на .log в директории app_logs. В этом задании вы просто скопируете их в новую директорию резервных копий. Ввод BACKUP_FILENAME остается меткой запуска, выводимой в консоль, а не архивным файлом, создаваемым скриптом.

Задачи

  • Сначала создайте директорию с именем backups внутри ~/project, куда будут копироваться лог-файлы.
  • Измените ваш скрипт log_manager.sh.
  • Внутри блока if (где подтверждается существование директории) добавьте цикл for.
  • Цикл должен перебирать каждый файл, заканчивающийся на .log внутри директории $LOG_DIR.
  • Внутри цикла используйте команду cp для копирования каждого лог-файла в директорию ~/project/backups.
  • Для каждого скопированного файла выводите сообщение вида "Copied [filename]".

Требования

  • Вы должны сначала создать директорию ~/project/backups из командной строки.
  • Скрипт должен использовать цикл for.
  • Цикл должен перебирать файлы в $LOG_DIR, соответствующие шаблону *.log.
  • Команда cp должна использоваться внутри цикла для копирования файлов в ~/project/backups.
  • Команда echo должна сообщать имя каждого файла по мере его копирования.

Примеры

После выполнения этого шага при запуске скрипта с именем файла резервной копии он должен обработать все лог-файлы и вывести примерно следующее:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: daily_backup
Backing up logs to: daily_backup
Copied /home/labex/project/app_logs/access.log
Copied /home/labex/project/app_logs/debug.log
Copied /home/labex/project/app_logs/error.log
Backup complete.

Скрипт должен перебрать каждый файл .log в директории, отображая сообщение "Copied" для каждого из них. Точные имена файлов будут зависеть от лог-файлов, присутствующих в вашей директории app_logs.

После завершения работы скрипта вы можете проверить, были ли файлы скопированы, просмотрев директорию backups:

ls ~/project/backups/
access.log  debug.log  error.log

Подсказки

  • Вы можете создать директорию с помощью команды mkdir.
  • Цикл for для файлов можно записать как for file in /path/to/*.log; do ... done.
  • Синтаксис команды cp: cp <source> <destination>.
  • Переменная цикла (например, file) будет содержать полный путь к файлу на каждой итерации.

Резюме

Поздравляем, Мастер скриптов! Вы успешно создали полноценный, функциональный shell-скрипт с нуля. Вы взялись за реальную задачу — управление лог-файлами — и решили ее с помощью автоматизации.

В этом задании вы освоили несколько фундаментальных концепций написания shell-скриптов:

  • Создание и структурирование скрипта с помощью shebang.
  • Использование переменных для придания скрипту динамичности.
  • Получение ввода от пользователя с помощью read.
  • Реализация надежной проверки ошибок с помощью операторов if.
  • Автоматизация повторяющихся задач с помощью циклов for.
  • Управление правами доступа к файлам и запуск скрипта.

Теперь ваш скрипт может автоматически проверять наличие директорий с логами, обрабатывать все лог-файлы и копировать их в место для резервного копирования. Это огромный шаг в вашем пути как DevOps-инженера или системного администратора. Навыки, которые вы здесь отработали, являются фундаментом для написания гораздо более сложных скриптов автоматизации, способных управлять серверами, развертывать приложения и обрабатывать данные. Вы доказали, что можете брать на себя ответственность и предоставлять работающее решение. Отличная работа!

✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться