15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij
29.10.2024
1 +1

Pisanie Skryptów w Linux Bash: Kompletny Przewodnik dla Początkujących i Administratorów Systemów

Skryptowanie w Bash to jedna z najpotężniejszych umiejętności, jakie może rozwinąć użytkownik Linux, programista lub administrator systemu. Niezależnie od tego, czy zarządzasz pojedynczym serwerem, czy orkiestrujesz złożone zautomatyzowane przepływy pracy w całej infrastrukturze, opanowanie skryptowania w Bash znacznie redukuje ręczny wysiłek, minimalizuje błędy ludzkie i odblokowuje pełny potencjał środowiska Linux.

W tym kompleksowym przewodniku przeprowadzimy Cię przez wszystko, co musisz wiedzieć o pisaniu skryptów Bash — od tworzenia pierwszego pliku po pracę ze zmiennymi, instrukcjami warunkowymi, pętlami, funkcjami, argumentami i technikami debugowania. Przez cały czas zawarte są praktyczne przykłady gotowe do skopiowania i wklejenia.

Czym jest skrypt Bash?

Skrypt Bash to zwykły plik tekstowy zawierający uporządkowaną sekwencję poleceń interpretowanych i wykonywanych przez powłokę Bash (Bourne Again SHell). Bash jest domyślną powłoką interaktywną w zdecydowanej większości dystrybucji Linux, co sprawia, że jest powszechnie dostępny i natychmiast praktyczny.

Zamiast wielokrotnie wpisywać tę samą sekwencję poleceń w terminalu, piszesz je raz wewnątrz pliku skryptu i wykonujesz na żądanie — lub planujesz ich automatyczne uruchamianie.

Typowe przypadki użycia skryptów Bash

  • Zarządzanie plikami — kopiowanie, przenoszenie, zmiana nazw, archiwizowanie i masowe usuwanie plików
  • Administracja systemem — monitorowanie procesów, zarządzanie użytkownikami, sprawdzanie użycia dysku
  • Automatyzacja oprogramowania — instalowanie pakietów, konfigurowanie usług, wdrażanie aplikacji
  • Tworzenie kopii zapasowych i odzyskiwanie — tworzenie zaplanowanych, przyrostowych lub pełnych kopii zapasowych systemu
  • Parsowanie logów i raportowanie — filtrowanie i podsumowywanie danych z logów do analizy
  • Provisioning serwerów — automatyzacja wstępnej konfiguracji nowego środowiska VPS Hosting lub serwera dedykowanego

Wymagania wstępne

Aby skorzystać z tego przewodnika, potrzebujesz:

  • Systemu Linux (lokalnej maszyny, VM lub zdalnego serwera)
  • Dostępu do terminala z kontem użytkownika (uprawnienia root lub sudo dla niektórych operacji)
  • Podstawowej znajomości wiersza poleceń Linux

Jeśli pracujesz na zdalnym serwerze, plany VPS Hosting AlexHost zapewniają pełny dostęp SSH z uprawnieniami root, co czyni je idealnymi do ćwiczenia i wdrażania skryptów Bash w rzeczywistym środowisku.

Krok 1: Utwórz plik skryptu Bash

Otwórz terminal i użyj dowolnego edytora tekstu, aby utworzyć nowy plik z rozszerzeniem .sh. Rozszerzenie .sh jest powszechnie przyjętą konwencją sygnalizującą, że plik jest skryptem powłoki, choć technicznie nie jest wymagane przez interpreter.

nano myscript.sh

Możesz zastąpić nano przez vim, gedit, micro lub dowolny inny preferowany edytor.

Krok 2: Dodaj linię shebang (#!)

Pierwsza linia każdego skryptu Bash musi być shebangiem — specjalną dyrektywą informującą system operacyjny, którego interpretera użyć podczas wykonywania pliku.

#!/bin/bash

Ta linia instruuje jądro, aby przekazało skrypt do /bin/bash w celu wykonania, niezależnie od tego, którą powłokę bieżący użytkownik ustawił jako domyślną. Zawsze ją dołączaj — pominięcie shebangu może powodować nieprzewidywalne zachowanie skryptów w różnych środowiskach.

> Wskazówka: W niektórych nowoczesnych systemach możesz również zobaczyć #!/usr/bin/env bash, co jest bardziej przenośną alternatywą, która dynamicznie lokalizuje plik binarny Bash za pomocą PATH.

Krok 3: Napisz swoje polecenia

Po shebangu dodaj polecenia, które skrypt ma wykonać. Oto prosty przykład, który wita bieżącego użytkownika i wyświetla przydatne informacje o systemie:

#!/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)"

Wyjaśnienie kluczowych elementów

ElementOpis
echoWyświetla tekst lub wartości zmiennych w terminalu (standardowe wyjście)
$USERWbudowana zmienna środowiskowa przechowująca bieżącą nazwę użytkownika
$(date)Podstawianie poleceń — wykonuje date i wstawia jego wynik w miejscu wywołania
$(pwd)Wstawia ścieżkę bieżącego katalogu roboczego
$(hostname)Wstawia nazwę hosta systemu
#Rozpoczyna komentarz — ignorowany przez interpreter, używany do dokumentacji

Krok 4: Nadaj skryptowi uprawnienia do wykonania

Zanim będziesz mógł uruchomić skrypt bezpośrednio, musisz nadać mu uprawnienia do wykonania za pomocą polecenia chmod:

chmod +x myscript.sh

Ustawia to bit wykonania dla właściciela pliku. Aby sprawdzić, czy uprawnienia zostały poprawnie zastosowane, uruchom:

ls -l myscript.sh

Powinieneś zobaczyć coś w stylu -rwxr-xr-x, gdzie znaki x potwierdzają uprawnienie do wykonania.

Krok 5: Uruchom skrypt

Wykonaj skrypt z tego samego katalogu, używając następującej składni:

./myscript.sh

Prefiks ./ informuje powłokę, aby szukała pliku w bieżącym katalogu, zamiast przeszukiwać systemową zmienną PATH. Powinieneś zobaczyć wynik wydrukowany bezpośrednio w terminalu.

Alternatywnie możesz wywołać go jawnie za pomocą interpretera:

bash myscript.sh

Zmienne w skryptach Bash

Zmienne pozwalają przechowywać i ponownie wykorzystywać dane w całym skrypcie. Mogą przechowywać ciągi znaków, liczby całkowite, ścieżki plików lub wyniki poleceń.

Definiowanie i używanie zmiennych

#!/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"

Ważne zasady dotyczące zmiennych

  • Brak spacji wokół znaku = przy przypisywaniu wartości (name="value" jest poprawne; name = "value" nie jest)
  • Poprzedź nazwę zmiennej znakiem $ podczas odczytywania jej wartości: $variable_name
  • Używaj nawiasów klamrowych dla przejrzystości w złożonych ciągach: ${variable_name}
  • Nazwy zmiennych są rozróżniane pod względem wielkości liter: $Name i $name to różne zmienne

Przechwytywanie wyników poleceń w zmiennej

#!/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"

Instrukcje warunkowe w Bash

Logika warunkowa pozwala skryptowi podejmować decyzje i wykonywać różne ścieżki kodu na podstawie ocenianych warunków.

Podstawowa struktura 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

Typowe operatory porównania

OperatorZnaczenie
-eqRówny
-neRóżny od
-gtWiększy niż
-ltMniejszy niż
-geWiększy lub równy
-leMniejszy lub równy
-zCiąg jest pusty
-nCiąg nie jest pusty
-fPlik istnieje i jest zwykłym plikiem
-dKatalog istnieje

Sprawdzanie, czy plik istnieje

#!/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

Pętle w skryptach Bash

Pętle pozwalają wielokrotnie powtarzać blok poleceń — w określonym zakresie, na liście elementów lub do momentu zmiany warunku.

Pętla for — iteracja po zakresie

#!/bin/bash

echo "Counting from 1 to 5:"
for i in {1..5}; do
    echo "  Iteration: $i"
done

Pętla for — iteracja po liście elementów

#!/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

Pętla while — wykonywanie dopóki warunek jest prawdziwy

#!/bin/bash

counter=1

while [ $counter -le 5 ]; do
    echo "Counter value: $counter"
    counter=$((counter + 1))
done

echo "Loop complete."

Pętla until — wykonywanie dopóki warunek nie stanie się prawdziwy

#!/bin/bash

attempts=0

until [ $attempts -ge 3 ]; do
    echo "Attempt $((attempts + 1))..."
    attempts=$((attempts + 1))
done

echo "Maximum attempts reached."

Funkcje w skryptach Bash

Funkcje pozwalają hermetyzować wielokrotnie używane bloki logiki, dzięki czemu skrypty są czystsze, bardziej modularne i łatwiejsze w utrzymaniu — szczególnie gdy rosną w złożoności.

Definiowanie i wywoływanie funkcji

#!/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"

Praktyczna funkcja: sprawdzanie statusu usługi

#!/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"

> Uwaga: Słowo kluczowe local ogranicza zasięg zmiennej do wnętrza funkcji, zapobiegając niezamierzonym efektom ubocznym w większych skryptach.

Praca z argumentami wiersza poleceń

Skrypty Bash mogą przyjmować dane wejściowe bezpośrednio z wiersza poleceń podczas ich wywoływania, umożliwiając tworzenie elastycznych, wielokrotnego użytku skryptów, które zachowują się różnie w zależności od podanych parametrów.

Specjalne zmienne argumentów

ZmiennaOpis
$0Nazwa samego skryptu
$1, $2, $3Pierwszy, drugi i trzeci argument pozycyjny
$#Całkowita liczba przekazanych argumentów
$@Wszystkie argumenty jako lista
$*Wszystkie argumenty jako pojedynczy ciąg znaków
$?Kod wyjścia ostatnio wykonanego polecenia

Przykład: skrypt przyjmujący argumenty

#!/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."

Uruchom go w następujący sposób:

./myscript.sh /var/www/html /var/backups/html_backup

Kody wyjścia i obsługa błędów

Solidne skrypty Bash zawsze obsługują błędy w sposób elegancki. Każde polecenie w Linux zwraca kod wyjścia: 0 oznacza sukces, a każda wartość niezerowa oznacza błąd.

Używanie exit i $?

#!/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

Używanie set -e do automatycznej obsługi błędów

Dodanie set -e na początku skryptu powoduje jego natychmiastowe zakończenie, jeśli jakiekolwiek polecenie zwróci niezerowy kod wyjścia — jest to najlepsza praktyka dla skryptów produkcyjnych:

#!/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."

Debugowanie skryptów Bash

Nawet doświadczeni programiści piszą skrypty z błędami. Bash udostępnia wbudowane narzędzia pomagające efektywnie śledzić i naprawiać problemy.

Metoda 1: Uruchomienie z flagą -x (tryb śledzenia)

bash -x myscript.sh

Wyświetla każde polecenie w terminalu podczas jego wykonywania, poprzedzone znakiem +, wraz z wartościami rozszerzonych zmiennych. Jest to najczęściej stosowana technika debugowania.

Metoda 2: Dodanie set -x wewnątrz skryptu

Możesz włączać i wyłączać śledzenie dla określonych sekcji skryptu:

#!/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."

Metoda 3: Używanie instrukcji echo jako punktów kontrolnych

Strategicznie rozmieszczone instrukcje echo pomagają weryfikować wartości zmiennych i potwierdzać, że wykonanie dotarło do określonego miejsca w skrypcie:

echo "DEBUG: backup_dir = $backup_dir"
echo "DEBUG: Reached checkpoint before rsync"

Praktyczny przykład z życia wzięty: zautomatyzowany skrypt kopii zapasowej

Oto kompletny, gotowy do produkcji skrypt Bash demonstrujący wiele koncepcji omówionych w tym przewodniku:

#!/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."

Ten typ skryptu jest nieoceniony na każdym serwerze produkcyjnym. Jeśli prowadzisz stronę internetową lub aplikację na Serwerach Dedykowanych lub VPS, automatyzacja kopii zapasowych za pomocą takiego skryptu — w połączeniu z zadaniem cron — zapewnia, że Twoje dane są zawsze chronione bez ręcznej interwencji.

Planowanie skryptów Bash za pomocą Cron

Aby automatycznie uruchamiać skrypty Bash według harmonogramu, użyj crona — planisty zadań Linux. Edytuj swój crontab za pomocą:

crontab -e

Dodaj linię w następującym formacie:

# Run backup script every day at 2:00 AM
0 2 * * * /path/to/backup.sh >> /var/log/backup_cron.log 2>&1

Składnia Cron: minute hour day-of-month month day-of-week command

Najlepsze praktyki pisania skryptów Bash

Przestrzeganie tych konwencji sprawi, że Twoje skrypty będą bardziej niezawodne, czytelne i łatwiejsze w utrzymaniu:

  1. Zawsze dołączaj shebang (#!/bin/bash) w pierwszej linii
  2. Używaj set -euo pipefail w skryptach produkcyjnych, aby wcześnie wykrywać błędy
  3. Umieszczaj zmienne w cudzysłowach ("$variable"), aby zapobiec problemom z podziałem słów i globbingiem
  4. Używaj znaczących nazw zmiennychbackup_directory jest bardziej czytelne niż bd
  5. Komentuj swój kod — wyjaśniaj *dlaczego*, a nie tylko *co*
  6. Waliduj dane wejściowe — sprawdzaj, czy wymagane argumenty i pliki istnieją przed kontynuowaniem
  7. Używaj funkcji do organizowania złożonej logiki w wielokrotnie używane, nazwane bloki
  8. Testuj w bezpiecznym środowisku przed uruchomieniem skryptów na systemach produkcyjnych
  9. Używaj zmiennych local wewnątrz funkcji, aby uniknąć zanieczyszczania globalnego zakresu
  10. Rejestruj ważne działania w pliku, abyś mógł później audytować zachowanie skryptu

Rozwijanie umiejętności Bash

Gdy opanujesz podstawy, rozważ zgłębienie tych zaawansowanych tematów:

  • Wyrażenia regularne z grep, sed i awk do zaawansowanego przetwarzania tekstu
  • Dokumenty heredoc (heredoc) do osadzania wieloliniowych ciągów w skryptach
  • Podstawianie procesów i nazwane potoki do złożonych potoków danych
  • Obsługa sygnałów za pomocą trap do eleganckie zakończenia skryptu
  • Tablice asocjacyjne (Bash 4+) do struktur danych klucz-wartość
  • Biblioteki skryptów — ładowanie wspólnych funkcji z udostępnionego pliku za pomocą source

Jeśli zarządzasz aplikacjami internetowymi, bazami danych lub infrastrukturą poczty e-mail, skryptowanie w Bash naturalnie współgra z usługami takimi jak Współdzielony Hosting dla mniejszych projektów lub w pełni zarządzany VPS z cPanel dla środowisk, w których chcesz mieć graficzny interfejs obok dostępu do powłoki.

Dla zespołów obsługujących intensywne obciążenia danych lub potoki uczenia maszynowego, skrypty Bash są równie cenne do orkiestrowania zadań na infrastrukturze GPU Hosting — automatyzowania przebiegów trenowania modeli, zarządzania zbiorami danych i obsługi konfiguracji środowiska.

Podsumowanie

Skryptowanie w Bash to niezbędna umiejętność dla każdego, kto pracuje z Linux — niezależnie od tego, czy jesteś początkującym automatyzującym swoje pierwsze powtarzalne zadanie, czy starszym administratorem systemów zarządzającym złożoną infrastrukturą serwerową. Koncepcje omówione w tym przewodniku — tworzenie plików, zmienne, instrukcje warunkowe, pętle, funkcje, obsługa argumentów, zarządzanie błędami i debugowanie — tworzą kompletny fundament potrzebny do pisania niezawodnych skryptów o jakości produkcyjnej.

Zacznij od małych kroków: zautomatyzuj jedno zadanie, które wykonujesz ręcznie każdego dnia. W miarę jak rośnie Twoja pewność siebie, łącz te elementy składowe w coraz bardziej zaawansowane narzędzia, które oszczędzają godziny pracy, zmniejszają ryzyko błędów ludzkich i dają Ci precyzyjną, powtarzalną kontrolę nad systemami.

Aby uzyskać najlepsze środowisko do ćwiczenia i wdrażania skryptów Bash, zapoznaj się z ofertą planów VPS Hosting AlexHost opartych na Linux — oferujących pełny dostęp root, pamięć masową SSD i elastyczne konfiguracje zaprojektowane dla programistów i administratorów systemów.

15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij