Написання скриптів у Linux Bash: Повний посібник для початківців та системних адміністраторів
Bash-скриптинг — одна з найпотужніших навичок, яку може розвинути користувач Linux, розробник або системний адміністратор. Незалежно від того, чи керуєте ви одним сервером, чи організовуєте складні автоматизовані робочі процеси в межах усієї інфраструктури, опанування Bash-скриптингу значно скорочує ручну роботу, мінімізує людські помилки та розкриває повний потенціал вашого середовища Linux.
У цьому вичерпному посібнику ми розглянемо все, що вам потрібно знати про написання Bash-скриптів — від створення першого файлу до роботи зі змінними, умовними операторами, циклами, функціями, аргументами та методами налагодження. Протягом усього посібника наведено практичні приклади, готові до копіювання.
Що таке Bash-скрипт?
Bash-скрипт — це простий текстовий файл, що містить упорядковану послідовність команд, які інтерпретуються та виконуються оболонкою Bash (Bourne Again SHell). Bash є стандартною інтерактивною оболонкою у переважній більшості дистрибутивів Linux, що робить її універсально доступною та одразу практичною.
Замість того щоб щоразу вводити одну й ту саму послідовність команд у терміналі, ви записуєте їх один раз у файл скрипту та виконуєте на вимогу — або плануєте автоматичний запуск.
Поширені випадки використання Bash-скриптів
- Керування файлами — масове копіювання, переміщення, перейменування, архівування та видалення файлів
- Системне адміністрування — моніторинг процесів, керування користувачами, перевірка використання диска
- Автоматизація програмного забезпечення — встановлення пакетів, налаштування служб, розгортання застосунків
- Резервне копіювання та відновлення — створення запланованих, інкрементних або повних резервних копій системи
- Аналіз журналів та звітність — фільтрація та узагальнення даних журналів для аналізу
- Підготовка серверів — автоматизація початкового налаштування нового середовища VPS Hosting або виділеного сервера
Передумови
Для роботи з цим посібником вам знадобиться:
- Система Linux (локальна машина, VM або віддалений сервер)
- Доступ до терміналу з обліковим записом користувача (права root або sudo для деяких операцій)
- Базове знайомство з командним рядком Linux
Якщо ви працюєте на віддаленому сервері, плани VPS Hosting від 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."Такий тип скрипту є безцінним на будь-якому виробничому сервері. Якщо ви запускаєте вебсайт або застосунок на Dedicated Servers або 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для потужної обробки тексту - Here documents (
heredoc) для вбудовування багаторядкових рядків у скрипти - Підстановка процесів та іменовані канали для складних конвеєрів даних
- Обробка сигналів за допомогою
trapдля коректного завершення скрипту - Асоціативні масиви (Bash 4+) для структур даних типу ключ-значення
- Бібліотеки скриптів — підключення спільних функцій із загального файлу за допомогою
source
Якщо ви керуєте вебзастосунками, базами даних або поштовою інфраструктурою, Bash-скриптинг природно поєднується з такими сервісами, як Shared Web Hosting для менших проектів або повністю керований VPS з cPanel для середовищ, де потрібен графічний інтерфейс поряд із доступом до оболонки.
Для команд, що виконують інтенсивні обчислення або конвеєри машинного навчання, Bash-скрипти однаково цінні для оркестрування завдань на інфраструктурі GPU Hosting — автоматизації запусків навчання моделей, керування наборами даних та налаштування середовища.
Висновок
Bash-скриптинг — незамінна навичка для всіх, хто працює з Linux — незалежно від того, чи ви початківець, що автоматизує своє перше рутинне завдання, чи досвідчений системний адміністратор, що керує складною серверною інфраструктурою. Концепції, розглянуті в цьому посібнику — створення файлів, змінні, умовні оператори, цикли, функції, обробка аргументів, керування помилками та налагодження — формують повну основу, необхідну для написання надійних скриптів виробничої якості.
Починайте з малого: автоматизуйте одне завдання, яке ви виконуєте вручну щодня. У міру зростання впевненості поєднуйте ці будівельні блоки у дедалі складніші інструменти, що економлять години роботи, знижують ризик людської помилки та дають вам точний, відтворюваний контроль над вашими системами.
Для найкращого середовища практики та розгортання Bash-скриптів ознайомтеся з лінійкою Linux-планів VPS Hosting від AlexHost — з повним root-доступом, SSD-сховищем та гнучкими конфігураціями, розробленими для розробників та системних адміністраторів.
