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 Хостинг или среда на dedicated сървър

Предварителни изисквания

За да следвате това ръководство, ви е необходимо:

  • Linux система (локална машина, VM или отдалечен сървър)
  • Достъп до терминал с потребителски акаунт (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."

Този тип скрипт е безценен на всеки продукционен сървър. Ако управлявате уебсайт или приложение на Dedicated сървъри или 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 документи (heredoc) за вграждане на многоредови низове в скриптове
  • Заместване на процеси и именувани тръби за сложни конвейери от данни
  • Обработка на сигнали с trap за коректно прекратяване на скриптове
  • Асоциативни масиви (Bash 4+) за структури от данни тип ключ-стойност
  • Библиотеки от скриптове — зареждане на общи функции от споделен файл с source

Ако управлявате уеб приложения, бази данни или имейл инфраструктура, Bash скриптингът се съчетава естествено с услуги като Споделен уеб хостинг за по-малки проекти, или напълно управляван VPS с cPanel за среди, където искате графичен интерфейс заедно с достъп до обвивката.

За екипи, изпълняващи интензивни на данни работни натоварвания или конвейери за машинно обучение, Bash скриптовете са еднакво ценни за оркестриране на задачи в GPU Хостинг инфраструктура — автоматизиране на тренировъчни изпълнения на модели, управление на набори от данни и обработка на настройката на средата.

Заключение

Bash скриптингът е незаменимо умение за всеки, работещ с Linux — независимо дали сте начинаещ, автоматизиращ първата си повтаряща се задача, или старши системен администратор, управляващ сложна сървърна инфраструктура. Концепциите, разгледани в това ръководство — създаване на файлове, променливи, условни оператори, цикли, функции, обработка на аргументи, управление на грешки и отстраняване на грешки — формират пълната основа, от която се нуждаете, за да пишете надеждни, продукционно качествени скриптове.

Започнете с малко: автоматизирайте една задача, която изпълнявате ръчно всеки ден. Докато увереността ви расте, комбинирайте тези градивни блокове в все по-сложни инструменти, които спестяват часове работа, намаляват риска от човешка грешка и ви дават прецизен, повторяем контрол върху системите ви.

За най-добрата среда за практикуване и разгръщане на Bash скриптовете ви, разгледайте гамата от базирани на Linux VPS Хостинг планове на AlexHost — с пълен root достъп, SSD съхранение и гъвкави конфигурации, проектирани за разработчици и системни администратори.

15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало