Написание скриптов в Linux Bash: Полное руководство для начинающих и системных администраторов
Bash-скриптинг — один из самых мощных навыков, которые может развить пользователь Linux, разработчик или системный администратор. Независимо от того, управляете ли вы одним сервером или организуете сложные автоматизированные рабочие процессы в рамках всей инфраструктуры, владение Bash-скриптингом значительно сокращает ручной труд, минимизирует человеческие ошибки и раскрывает весь потенциал вашей среды Linux.
В этом подробном руководстве мы расскажем вам всё, что нужно знать о написании Bash-скриптов — от создания самого первого файла до работы с переменными, условными операторами, циклами, функциями, аргументами и методами отладки. На протяжении всего руководства приведены практические примеры, готовые к копированию и использованию.
Что такое Bash-скрипт?
Bash-скрипт — это обычный текстовый файл, содержащий упорядоченную последовательность команд, которые интерпретируются и выполняются оболочкой Bash (Bourne Again SHell). Bash является стандартной интерактивной оболочкой в подавляющем большинстве дистрибутивов Linux, что делает его универсально доступным и сразу же применимым на практике.
Вместо того чтобы многократно вводить одну и ту же последовательность команд в терминале, вы записываете их один раз в файл скрипта и выполняете по требованию — или планируете автоматический запуск.
Распространённые варианты использования Bash-скриптов
- Управление файлами — массовое копирование, перемещение, переименование, архивирование и удаление файлов
- Системное администрирование — мониторинг процессов, управление пользователями, проверка использования дискового пространства
- Автоматизация программного обеспечения — установка пакетов, настройка служб, развёртывание приложений
- Резервное копирование и восстановление — создание запланированных, инкрементальных или полных резервных копий системы
- Анализ журналов и составление отчётов — фильтрация и обобщение данных журналов для анализа
- Подготовка серверов — автоматизация первоначальной настройки нового VPS Хостинга или выделенного сервера
Предварительные требования
Для работы с этим руководством вам потребуется:
- Система Linux (локальная машина, виртуальная машина или удалённый сервер)
- Доступ к терминалу с учётной записью пользователя (права root или sudo для некоторых операций)
- Базовое знакомство с командной строкой Linux
Если вы работаете на удалённом сервере, тарифные планы VPS Хостинга от AlexHost предоставляют полный root SSH-доступ, что делает их идеальными для практики и развёртывания Bash-скриптов в реальной среде.
Шаг 1: Создание файла Bash-скрипта
Откройте терминал и используйте любой текстовый редактор для создания нового файла с расширением .sh. Расширение .sh является широко принятым соглашением, указывающим на то, что файл является скриптом оболочки, хотя технически оно не требуется интерпретатором.
nano myscript.shВы можете заменить nano на vim, gedit, micro или любой другой предпочитаемый вами редактор.
Шаг 2: Добавление строки shebang (#!)
Самая первая строка каждого Bash-скрипта должна содержать shebang — специальную директиву, которая сообщает операционной системе, какой интерпретатор использовать при выполнении файла.
#!/bin/bashЭта строка указывает ядру передать скрипт на выполнение в /bin/bash, независимо от того, какая оболочка установлена по умолчанию для текущего пользователя. Всегда включайте её — отсутствие shebang может привести к непредсказуемому поведению скриптов в различных средах.
> Совет: В некоторых современных системах вы также можете встретить #!/usr/bin/env bash — более переносимый вариант, который динамически определяет местоположение двоичного файла Bash через PATH.
Шаг 3: Написание команд
После shebang добавьте команды, которые должен выполнять скрипт. Вот простой пример, который приветствует текущего пользователя и отображает полезную системную информацию:
#!/bin/bash
# A simple script to greet the user and display system info
echo "Hello, $USER! Welcome back."
echo "Today's date and time: $(date)"
echo "Your current working directory: $(pwd)"
echo "System hostname: $(hostname)"Описание ключевых элементов
| Элемент | Описание |
|---|---|
echo | Выводит текст или значения переменных в терминал (стандартный вывод) |
$USER | Встроенная переменная среды, содержащая имя текущего пользователя |
$(date) | Подстановка команды — выполняет date и вставляет её вывод на место |
$(pwd) | Вставляет путь к текущему рабочему каталогу |
$(hostname) | Вставляет имя хоста системы |
# | Начало комментария — игнорируется интерпретатором, используется для документирования |
Шаг 4: Предоставление скрипту прав на выполнение
Прежде чем запустить скрипт напрямую, необходимо предоставить ему права на выполнение с помощью команды chmod:
chmod +x myscript.shЭто устанавливает бит выполнения для владельца файла. Чтобы убедиться, что права применены корректно, выполните:
ls -l myscript.shВы должны увидеть что-то вроде -rwxr-xr-x, где символы x подтверждают наличие права на выполнение.
Шаг 5: Запуск скрипта
Выполните скрипт из того же каталога, используя следующий синтаксис:
./myscript.shПрефикс ./ указывает оболочке искать файл в текущем каталоге, а не в системном PATH. Вывод должен появиться непосредственно в вашем терминале.
Кроме того, вы можете явно вызвать скрипт через интерпретатор:
bash myscript.shПеременные в Bash-скриптах
Переменные позволяют хранить и повторно использовать данные в скрипте. Они могут содержать строки, целые числа, пути к файлам или результаты выполнения команд.
Определение и использование переменных
#!/bin/bash
# Define variables
server_name="web-server-01"
max_connections=500
backup_dir="/var/backups"
# Use variables
echo "Server: $server_name"
echo "Max connections allowed: $max_connections"
echo "Backup directory: $backup_dir"Важные правила для переменных
- Без пробелов вокруг знака
=при присвоении значения (name="value"— правильно;name = "value"— неправильно) - Добавляйте
$перед именем переменной при чтении её значения:$variable_name - Используйте фигурные скобки для ясности в сложных строках:
${variable_name} - Имена переменных чувствительны к регистру:
$Nameи$name— разные переменные
Сохранение вывода команды в переменную
#!/bin/bash
current_date=$(date +"%Y-%m-%d")
disk_usage=$(df -h / | awk 'NR==2 {print $5}')
echo "Date: $current_date"
echo "Root partition usage: $disk_usage"Условные операторы в Bash
Условная логика позволяет скрипту принимать решения и выполнять различные ветви кода в зависимости от вычисленных условий.
Базовая структура if / elif / else
#!/bin/bash
echo "Enter a number between 1 and 100:"
read user_input
if [ "$user_input" -ge 1 ] && [ "$user_input" -le 50 ]; then
echo "Your number is in the lower half (1–50)."
elif [ "$user_input" -ge 51 ] && [ "$user_input" -le 100 ]; then
echo "Your number is in the upper half (51–100)."
else
echo "Your number is outside the valid range."
fiРаспространённые операторы сравнения
| Оператор | Значение |
|---|---|
-eq | Равно |
-ne | Не равно |
-gt | Больше |
-lt | Меньше |
-ge | Больше или равно |
-le | Меньше или равно |
-z | Строка пуста |
-n | Строка не пуста |
-f | Файл существует и является обычным файлом |
-d | Каталог существует |
Проверка существования файла
#!/bin/bash
config_file="/etc/nginx/nginx.conf"
if [ -f "$config_file" ]; then
echo "Configuration file found: $config_file"
else
echo "ERROR: Configuration file not found at $config_file"
exit 1
fiЦиклы в Bash-скриптах
Циклы позволяют повторять блок команд несколько раз — в заданном диапазоне, по списку элементов или до изменения условия.
Цикл for — итерация по диапазону
#!/bin/bash
echo "Counting from 1 to 5:"
for i in {1..5}; do
echo " Iteration: $i"
doneЦикл for — итерация по списку элементов
#!/bin/bash
servers=("web-01" "web-02" "db-01" "cache-01")
for server in "${servers[@]}"; do
echo "Pinging server: $server"
ping -c 1 "$server" &>/dev/null && echo " ✔ $server is reachable" || echo " ✘ $server is unreachable"
doneЦикл while — выполнение пока условие истинно
#!/bin/bash
counter=1
while [ $counter -le 5 ]; do
echo "Counter value: $counter"
counter=$((counter + 1))
done
echo "Loop complete."Цикл until — выполнение до тех пор, пока условие не станет истинным
#!/bin/bash
attempts=0
until [ $attempts -ge 3 ]; do
echo "Attempt $((attempts + 1))..."
attempts=$((attempts + 1))
done
echo "Maximum attempts reached."Функции в Bash-скриптах
Функции позволяют инкапсулировать повторно используемые блоки логики, делая скрипты более чистыми, модульными и удобными в сопровождении — особенно по мере роста их сложности.
Определение и вызов функции
#!/bin/bash
# Define the function
greet_user() {
local username="$1"
echo "Hello, $username! Your session started at $(date +"%H:%M:%S")."
}
# Call the function with arguments
greet_user "Alice"
greet_user "Bob"Практическая функция: проверка статуса службы
#!/bin/bash
check_service() {
local service_name="$1"
if systemctl is-active --quiet "$service_name"; then
echo "✔ $service_name is running."
else
echo "✘ $service_name is NOT running. Attempting to start..."
systemctl start "$service_name" && echo " Started successfully." || echo " Failed to start $service_name."
fi
}
check_service "nginx"
check_service "mysql"
check_service "ssh"> Примечание: Ключевое слово local ограничивает область видимости переменной пределами функции, предотвращая непреднамеренные побочные эффекты в более крупных скриптах.
Работа с аргументами командной строки
Bash-скрипты могут принимать входные данные непосредственно из командной строки при вызове, что позволяет создавать гибкие, многократно используемые скрипты, поведение которых меняется в зависимости от переданных параметров.
Специальные переменные аргументов
| Переменная | Описание |
|---|---|
$0 | Имя самого скрипта |
$1, $2, $3 | Первый, второй и третий позиционные аргументы |
$# | Общее количество переданных аргументов |
$@ | Все аргументы в виде списка |
$* | Все аргументы в виде одной строки |
$? | Код завершения последней выполненной команды |
Пример: скрипт, принимающий аргументы
#!/bin/bash
# Validate that exactly two arguments were provided
if [ $# -ne 2 ]; then
echo "Usage: $0 <source_directory> <destination_directory>"
exit 1
fi
source_dir="$1"
dest_dir="$2"
# Check that the source directory exists
if [ ! -d "$source_dir" ]; then
echo "ERROR: Source directory '$source_dir' does not exist."
exit 1
fi
echo "Copying files from '$source_dir' to '$dest_dir'..."
cp -r "$source_dir" "$dest_dir" && echo "Copy completed successfully." || echo "Copy failed."Запустите его следующим образом:
./myscript.sh /var/www/html /var/backups/html_backupКоды завершения и обработка ошибок
Надёжные Bash-скрипты всегда корректно обрабатывают ошибки. Каждая команда в Linux возвращает код завершения: 0 означает успех, любое ненулевое значение — ошибку.
Использование exit и $?
#!/bin/bash
# Attempt to create a directory
mkdir /tmp/test_directory
if [ $? -eq 0 ]; then
echo "Directory created successfully."
else
echo "Failed to create directory."
exit 1
fiИспользование set -e для автоматической обработки ошибок
Добавление set -e в начало скрипта приводит к его немедленному завершению, если какая-либо команда возвращает ненулевой код завершения — это рекомендуемая практика для производственных скриптов:
#!/bin/bash
set -e # Exit on any error
set -u # Treat unset variables as errors
set -o pipefail # Catch errors in pipelines
echo "Starting deployment..."
cd /var/www/html
git pull origin main
systemctl reload nginx
echo "Deployment complete."Отладка Bash-скриптов
Даже опытные разработчики пишут скрипты с ошибками. Bash предоставляет встроенные инструменты для эффективного поиска и исправления проблем.
Метод 1: Запуск с флагом -x (режим трассировки)
bash -x myscript.shЭто выводит каждую команду в терминал по мере её выполнения с префиксом +, а также значения всех раскрытых переменных. Это наиболее часто используемый метод отладки.
Метод 2: Добавление set -x внутри скрипта
Вы можете включать и отключать трассировку для отдельных частей скрипта:
#!/bin/bash
echo "Normal execution..."
set -x # Enable tracing
cp /source/file /destination/
chmod 644 /destination/file
set +x # Disable tracing
echo "Tracing disabled again."Метод 3: Использование операторов echo в качестве контрольных точек
Стратегически размещённые операторы echo помогают проверить значения переменных и убедиться, что выполнение достигло определённой точки в скрипте:
echo "DEBUG: backup_dir = $backup_dir"
echo "DEBUG: Reached checkpoint before rsync"Практический пример из реальной жизни: скрипт автоматического резервного копирования
Вот полный, готовый к использованию в производственной среде Bash-скрипт, демонстрирующий многие концепции, рассмотренные в этом руководстве:
#!/bin/bash
set -euo pipefail
# ============================================================
# Automated Backup Script
# Description: Backs up a specified directory with a timestamp
# ============================================================
# Configuration
SOURCE_DIR="/var/www/html"
BACKUP_ROOT="/var/backups/web"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_NAME="backup_${TIMESTAMP}.tar.gz"
BACKUP_PATH="${BACKUP_ROOT}/${BACKUP_NAME}"
RETENTION_DAYS=7
LOG_FILE="/var/log/backup.log"
# Logging function
log() {
echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"
}
# Validate source directory
if [ ! -d "$SOURCE_DIR" ]; then
log "ERROR: Source directory '$SOURCE_DIR' not found. Aborting."
exit 1
fi
# Create backup root if it doesn't exist
mkdir -p "$BACKUP_ROOT"
log "Starting backup of '$SOURCE_DIR'..."
# Create compressed archive
tar -czf "$BACKUP_PATH" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
log "Backup created: $BACKUP_PATH ($(du -sh "$BACKUP_PATH" | cut -f1))"
# Remove backups older than retention period
log "Removing backups older than ${RETENTION_DAYS} days..."
find "$BACKUP_ROOT" -name "backup_*.tar.gz" -mtime +"$RETENTION_DAYS" -delete
log "Backup process completed successfully."Такой скрипт незаменим на любом производственном сервере. Если вы запускаете веб-сайт или приложение на Выделенных серверах или VPS, автоматизация резервного копирования с помощью подобного скрипта в сочетании с заданием cron гарантирует постоянную защиту ваших данных без ручного вмешательства.
Планирование Bash-скриптов с помощью Cron
Для автоматического запуска Bash-скриптов по расписанию используйте cron — планировщик задач Linux. Отредактируйте crontab с помощью:
crontab -eДобавьте строку в следующем формате:
# Run backup script every day at 2:00 AM
0 2 * * * /path/to/backup.sh >> /var/log/backup_cron.log 2>&1Синтаксис cron: minute hour day-of-month month day-of-week command
Рекомендации по написанию Bash-скриптов
Следование этим соглашениям сделает ваши скрипты более надёжными, читаемыми и удобными в сопровождении:
- Всегда включайте shebang (
#!/bin/bash) в первую строку - Используйте
set -euo pipefailв производственных скриптах для раннего обнаружения ошибок - Заключайте переменные в кавычки (
"$variable"), чтобы избежать проблем с разбиением слов и глоббингом - Используйте осмысленные имена переменных —
backup_directoryпонятнее, чемbd - Комментируйте код — объясняйте *почему*, а не только *что*
- Проверяйте входные данные — убедитесь, что необходимые аргументы и файлы существуют, прежде чем продолжить
- Используйте функции для организации сложной логики в повторно используемые именованные блоки
- Тестируйте в безопасной среде перед запуском скриптов на производственных системах
- Используйте переменные
localвнутри функций, чтобы не засорять глобальную область видимости - Записывайте важные действия в файл, чтобы впоследствии можно было проверить поведение скрипта
Дальнейшее развитие навыков Bash
Освоив основы, рассмотрите возможность изучения следующих продвинутых тем:
- Регулярные выражения с
grep,sedиawkдля мощной обработки текста - Встроенные документы (
heredoc) для встраивания многострочных строк в скрипты - Подстановка процессов и именованные каналы для сложных конвейеров данных
- Обработка сигналов с помощью
trapдля корректного завершения скрипта - Ассоциативные массивы (Bash 4+) для структур данных типа ключ-значение
- Библиотеки скриптов — подключение общих функций из общего файла с помощью
source
Если вы управляете веб-приложениями, базами данных или почтовой инфраструктурой, Bash-скриптинг органично сочетается с такими сервисами, как Виртуальный веб-хостинг для небольших проектов или полностью управляемый VPS с cPanel для сред, где требуется графический интерфейс наряду с доступом к оболочке.
Для команд, выполняющих ресурсоёмкие вычисления или конвейеры машинного обучения, Bash-скрипты одинаково ценны для оркестрации заданий на инфраструктуре GPU Хостинга — автоматизации запусков обучения моделей, управления наборами данных и настройки среды.
Заключение
Bash-скриптинг — незаменимый навык для всех, кто работает с Linux: будь то начинающий пользователь, автоматизирующий свою первую рутинную задачу, или опытный системный администратор, управляющий сложной серверной инфраструктурой. Концепции, рассмотренные в этом руководстве — создание файлов, переменные, условные операторы, циклы, функции, обработка аргументов, управление ошибками и отладка — формируют полный фундамент, необходимый для написания надёжных скриптов производственного качества.
Начните с малого: автоматизируйте одну задачу, которую вы выполняете вручную каждый день. По мере роста уверенности объединяйте эти строительные блоки во всё более сложные инструменты, которые экономят часы работы, снижают риск человеческих ошибок и дают вам точный, воспроизводимый контроль над вашими системами.
Для наилучшей среды практики и развёртывания Bash-скриптов ознакомьтесь с линейкой Linux-based тарифных планов VPS Хостинга от AlexHost — с полным root-доступом, SSD-хранилищем и гибкими конфигурациями, разработанными для разработчиков и системных администраторов.
