15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати
29.10.2024
1 +1

Написання скриптів у 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-скриптів

Дотримання цих правил зробить ваші скрипти надійнішими, читабельнішими та простішими у підтримці:

  1. Завжди включайте shebang (#!/bin/bash) у першому рядку
  2. Використовуйте set -euo pipefail у виробничих скриптах для раннього виявлення помилок
  3. Беріть змінні в лапки ("$variable"), щоб уникнути проблем із розбиттям слів та глобінгом
  4. Використовуйте змістовні імена зміннихbackup_directory зрозуміліше, ніж bd
  5. Коментуйте код — пояснюйте *чому*, а не лише *що*
  6. Перевіряйте вхідні дані — переконайтеся, що необхідні аргументи та файли існують перед продовженням
  7. Використовуйте функції для організації складної логіки у багаторазові іменовані блоки
  8. Тестуйте в безпечному середовищі перед запуском скриптів на виробничих системах
  9. Використовуйте змінні local всередині функцій, щоб уникнути забруднення глобальної області видимості
  10. Записуйте важливі дії у файл, щоб пізніше мати змогу перевірити поведінку скрипту

Подальший розвиток навичок 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-сховищем та гнучкими конфігураціями, розробленими для розробників та системних адміністраторів.

15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати