15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen
29.10.2024
1 +1

Bash-Skripte in Linux schreiben: Ein vollständiger Leitfaden für Einsteiger und Sysadmins

Bash-Scripting ist eine der mächtigsten Fähigkeiten, die ein Linux-Benutzer, Entwickler oder Systemadministrator erlernen kann. Ob Sie einen einzelnen Server verwalten oder komplexe automatisierte Workflows über eine gesamte Infrastruktur hinweg orchestrieren – die Beherrschung von Bash-Scripting reduziert den manuellen Aufwand erheblich, minimiert menschliche Fehler und schöpft das volle Potenzial Ihrer Linux-Umgebung aus.

In diesem umfassenden Leitfaden führen wir Sie durch alles, was Sie über das Schreiben von Bash-Skripten wissen müssen – von der Erstellung Ihrer allerersten Datei bis hin zur Arbeit mit Variablen, Bedingungen, Schleifen, Funktionen, Argumenten und Debugging-Techniken. Praktische, kopierfertige Beispiele sind durchgehend enthalten.

Was ist ein Bash-Skript?

Ein Bash-Skript ist eine einfache Textdatei, die eine geordnete Abfolge von Befehlen enthält, die von der Bash-Shell (Bourne Again SHell) interpretiert und ausgeführt werden. Bash ist die Standard-Interaktionsshell auf der überwiegenden Mehrheit der Linux-Distributionen, was sie universell verfügbar und unmittelbar praktisch macht.

Anstatt dieselbe Befehlsfolge wiederholt in einem Terminal einzutippen, schreiben Sie sie einmal in eine Skriptdatei und führen sie bei Bedarf aus – oder planen Sie sie für eine automatische Ausführung.

Häufige Anwendungsfälle für Bash-Skripte

  • Dateiverwaltung — Kopieren, Verschieben, Umbenennen, Archivieren und Massenlöschen von Dateien
  • Systemadministration — Überwachung von Prozessen, Benutzerverwaltung, Überprüfung der Festplattennutzung
  • Software-Automatisierung — Installation von Paketen, Konfiguration von Diensten, Bereitstellung von Anwendungen
  • Backup und Wiederherstellung — Erstellung geplanter, inkrementeller oder vollständiger System-Backups
  • Log-Analyse und Berichterstellung — Filtern und Zusammenfassen von Log-Daten zur Analyse
  • Server-Provisionierung — Automatisierung der Ersteinrichtung eines neuen VPS Hosting– oder Dedicated-Server-Umgebung

Voraussetzungen

Um diesem Leitfaden zu folgen, benötigen Sie:

  • Ein Linux-System (lokaler Rechner, VM oder Remote-Server)
  • Terminal-Zugang mit einem Benutzerkonto (root- oder sudo-Berechtigungen für einige Operationen)
  • Grundlegende Kenntnisse der Linux-Befehlszeile

Wenn Sie auf einem Remote-Server arbeiten, bieten Ihnen AlexHosts VPS Hosting-Pläne vollen root-SSH-Zugang, was sie ideal für das Üben und Bereitstellen von Bash-Skripten in einer realen Umgebung macht.

Schritt 1: Eine Bash-Skriptdatei erstellen

Öffnen Sie Ihr Terminal und verwenden Sie einen beliebigen Texteditor, um eine neue Datei mit der Erweiterung .sh zu erstellen. Die Erweiterung .sh ist eine weit verbreitete Konvention, die signalisiert, dass es sich bei der Datei um ein Shell-Skript handelt, obwohl sie vom Interpreter technisch gesehen nicht erforderlich ist.

nano myscript.sh

Sie können nano durch vim, gedit, micro oder einen anderen Editor Ihrer Wahl ersetzen.

Schritt 2: Die Shebang-Zeile hinzufügen (#!)

Die allererste Zeile jedes Bash-Skripts muss der Shebang sein – eine spezielle Direktive, die dem Betriebssystem mitteilt, welchen Interpreter es bei der Ausführung der Datei verwenden soll.

#!/bin/bash

Diese Zeile weist den Kernel an, das Skript zur Ausführung an /bin/bash zu übergeben, unabhängig davon, welche Shell der aktuelle Benutzer als Standard festgelegt hat. Fügen Sie sie immer ein – das Weglassen des Shebangs kann dazu führen, dass Skripte in verschiedenen Umgebungen unvorhersehbar funktionieren.

> Tipp: Auf einigen modernen Systemen sehen Sie möglicherweise auch #!/usr/bin/env bash, eine portablere Alternative, die die Bash-Binärdatei dynamisch über PATH lokalisiert.

Schritt 3: Befehle schreiben

Fügen Sie nach dem Shebang die Befehle hinzu, die das Skript ausführen soll. Hier ist ein einfaches Beispiel, das den aktuellen Benutzer begrüßt und nützliche Systeminformationen anzeigt:

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

Erklärung der Schlüsselelemente

ElementBeschreibung
echoGibt Text oder Variablenwerte im Terminal aus (Standardausgabe)
$USEREine eingebaute Umgebungsvariable, die den aktuellen Benutzernamen enthält
$(date)Befehlssubstitution — führt date aus und fügt dessen Ausgabe inline ein
$(pwd)Fügt den aktuellen Arbeitsverzeichnispfad ein
$(hostname)Fügt den Hostnamen des Systems ein
#Beginnt einen Kommentar — wird vom Interpreter ignoriert, dient der Dokumentation

Schritt 4: Das Skript ausführbar machen

Bevor Sie das Skript direkt ausführen können, müssen Sie ihm mit dem Befehl chmod Ausführungsberechtigungen erteilen:

chmod +x myscript.sh

Dies setzt das Ausführungsbit für den Dateibesitzer. Um zu überprüfen, ob die Berechtigungen korrekt angewendet wurden, führen Sie aus:

ls -l myscript.sh

Sie sollten etwas wie -rwxr-xr-x sehen, wobei die x-Zeichen die Ausführungsberechtigung bestätigen.

Schritt 5: Das Skript ausführen

Führen Sie das Skript aus demselben Verzeichnis mit der folgenden Syntax aus:

./myscript.sh

Das Präfix ./ weist die Shell an, die Datei im aktuellen Verzeichnis zu suchen, anstatt den System-PATH zu durchsuchen. Die Ausgabe sollte direkt in Ihrem Terminal erscheinen.

Alternativ können Sie es explizit mit dem Interpreter aufrufen:

bash myscript.sh

Variablen in Bash-Skripten

Variablen ermöglichen es Ihnen, Daten in Ihrem Skript zu speichern und wiederzuverwenden. Sie können Zeichenketten, Ganzzahlen, Dateipfade oder die Ausgabe von Befehlen enthalten.

Variablen definieren und verwenden

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

Wichtige Regeln für Variablen

  • Keine Leerzeichen um das =-Zeichen bei der Wertzuweisung (name="value" ist korrekt; name = "value" ist es nicht)
  • Stellen Sie dem Variablennamen $ voran, wenn Sie seinen Wert lesen: $variable_name
  • Verwenden Sie geschweifte Klammern für Klarheit in komplexen Zeichenketten: ${variable_name}
  • Variablennamen sind Groß-/Kleinschreibung-sensitiv: $Name und $name sind verschiedene Variablen

Befehlsausgabe in einer Variable erfassen

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

Bedingte Anweisungen in Bash

Bedingte Logik ermöglicht es Ihrem Skript, Entscheidungen zu treffen und verschiedene Code-Pfade basierend auf ausgewerteten Bedingungen auszuführen.

Grundlegende if / elif / else-Struktur

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

Häufige Vergleichsoperatoren

OperatorBedeutung
-eqGleich
-neUngleich
-gtGrößer als
-ltKleiner als
-geGrößer als oder gleich
-leKleiner als oder gleich
-zZeichenkette ist leer
-nZeichenkette ist nicht leer
-fDatei existiert und ist eine reguläre Datei
-dVerzeichnis existiert

Überprüfen, ob eine Datei existiert

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

Schleifen in Bash-Skripten

Schleifen ermöglichen es Ihnen, einen Block von Befehlen mehrmals zu wiederholen, entweder über einen definierten Bereich, eine Liste von Elementen oder bis sich eine Bedingung ändert.

for-Schleife — Iteration über einen Bereich

#!/bin/bash

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

for-Schleife — Iteration über eine Liste von Elementen

#!/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-Schleife — Ausführung bis eine Bedingung falsch wird

#!/bin/bash

counter=1

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

echo "Loop complete."

until-Schleife — Ausführung bis eine Bedingung wahr wird

#!/bin/bash

attempts=0

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

echo "Maximum attempts reached."

Funktionen in Bash-Skripten

Funktionen ermöglichen es Ihnen, wiederverwendbare Logikblöcke zu kapseln, wodurch Ihre Skripte sauberer, modularer und einfacher zu warten sind – besonders wenn sie an Komplexität zunehmen.

Eine Funktion definieren und aufrufen

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

Eine praktische Funktion: Dienststatus überprüfen

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

> Hinweis: Das Schlüsselwort local beschränkt den Gültigkeitsbereich einer Variable auf die Funktion und verhindert unbeabsichtigte Nebeneffekte in größeren Skripten.

Arbeiten mit Befehlszeilenargumenten

Bash-Skripte können bei ihrem Aufruf direkt Eingaben von der Befehlszeile entgegennehmen, was flexible, wiederverwendbare Skripte ermöglicht, die sich je nach den angegebenen Parametern unterschiedlich verhalten.

Spezielle Argumentvariablen

VariableBeschreibung
$0Der Name des Skripts selbst
$1, $2, $3Das erste, zweite und dritte Positionsargument
$#Die Gesamtzahl der übergebenen Argumente
$@Alle Argumente als Liste
$*Alle Argumente als einzelne Zeichenkette
$?Der Exit-Status des zuletzt ausgeführten Befehls

Beispiel: Ein Skript, das Argumente akzeptiert

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

Führen Sie es so aus:

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

Exit-Codes und Fehlerbehandlung

Robuste Bash-Skripte behandeln Fehler immer ordnungsgemäß. Jeder Befehl in Linux gibt einen Exit-Code zurück: 0 zeigt Erfolg an, und jeder Wert ungleich null zeigt einen Fehler an.

Verwendung von exit und $?

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

Verwendung von set -e für automatische Fehlerbehandlung

Das Hinzufügen von set -e am Anfang Ihres Skripts bewirkt, dass es sofort beendet wird, wenn ein Befehl einen Exit-Code ungleich null zurückgibt – eine bewährte Methode für Produktionsskripte:

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

Selbst erfahrene Entwickler schreiben Skripte mit Fehlern. Bash bietet integrierte Tools, die Ihnen helfen, Probleme effizient zu verfolgen und zu beheben.

Methode 1: Mit dem Flag -x ausführen (Trace-Modus)

bash -x myscript.sh

Dies gibt jeden Befehl mit dem Präfix + im Terminal aus, während er ausgeführt wird, zusammen mit den Werten aller erweiterten Variablen. Es ist die am häufigsten verwendete Debugging-Technik.

Methode 2: set -x im Skript hinzufügen

Sie können das Tracing für bestimmte Abschnitte Ihres Skripts aktivieren und deaktivieren:

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

Methode 3: echo-Anweisungen als Kontrollpunkte verwenden

Strategisch platzierte echo-Anweisungen helfen Ihnen, Variablenwerte zu überprüfen und zu bestätigen, dass die Ausführung einen bestimmten Punkt im Skript erreicht hat:

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

Praktisches Beispiel aus der realen Welt: Automatisiertes Backup-Skript

Hier ist ein vollständiges, produktionsreifes Bash-Skript, das viele der in diesem Leitfaden behandelten Konzepte demonstriert:

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

Diese Art von Skript ist auf jedem Produktionsserver von unschätzbarem Wert. Wenn Sie eine Website oder Anwendung auf Dedicated Servers oder einem VPS betreiben, stellt die Automatisierung Ihrer Backups mit einem solchen Skript – kombiniert mit einem Cron-Job – sicher, dass Ihre Daten immer ohne manuellen Eingriff geschützt sind.

Bash-Skripte mit Cron planen

Um Ihre Bash-Skripte automatisch nach einem Zeitplan auszuführen, verwenden Sie cron, den Linux-Aufgabenplaner. Bearbeiten Sie Ihre Crontab mit:

crontab -e

Fügen Sie eine Zeile im folgenden Format hinzu:

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

Cron-Syntax: minute hour day-of-month month day-of-week command

Best Practices für das Schreiben von Bash-Skripten

Die Einhaltung dieser Konventionen macht Ihre Skripte zuverlässiger, lesbarer und wartbarer:

  1. Fügen Sie immer den Shebang (#!/bin/bash) in der ersten Zeile ein
  2. Verwenden Sie set -euo pipefail in Produktionsskripten, um Fehler frühzeitig zu erkennen
  3. Setzen Sie Ihre Variablen in Anführungszeichen ("$variable"), um Probleme mit Worttrennung und Globbing zu vermeiden
  4. Verwenden Sie aussagekräftige Variablennamenbackup_directory ist klarer als bd
  5. Kommentieren Sie Ihren Code — erklären Sie *warum*, nicht nur *was*
  6. Validieren Sie Eingaben — überprüfen Sie, ob erforderliche Argumente und Dateien vorhanden sind, bevor Sie fortfahren
  7. Verwenden Sie Funktionen, um komplexe Logik in wiederverwendbare, benannte Blöcke zu organisieren
  8. Testen Sie in einer sicheren Umgebung, bevor Sie Skripte auf Produktionssystemen ausführen
  9. Verwenden Sie local-Variablen innerhalb von Funktionen, um den globalen Gültigkeitsbereich nicht zu verunreinigen
  10. Protokollieren Sie wichtige Aktionen in einer Datei, damit Sie das Skriptverhalten später prüfen können

Ihre Bash-Kenntnisse weiterentwickeln

Sobald Sie mit den Grundlagen vertraut sind, sollten Sie diese fortgeschrittenen Themen erkunden:

  • Reguläre Ausdrücke mit grep, sed und awk für leistungsstarke Textverarbeitung
  • Here-Dokumente (heredoc) zum Einbetten mehrzeiliger Zeichenketten in Skripten
  • Prozesssubstitution und Named Pipes für komplexe Datenpipelines
  • Signalbehandlung mit trap für eine ordnungsgemäße Skriptbeendigung
  • Assoziative Arrays (Bash 4+) für Schlüssel-Wert-Datenstrukturen
  • Skriptbibliotheken — Einbinden gemeinsamer Funktionen aus einer gemeinsamen Datei mit source

Wenn Sie Webanwendungen, Datenbanken oder E-Mail-Infrastruktur verwalten, ergänzt Bash-Scripting auf natürliche Weise Dienste wie Shared Web Hosting für kleinere Projekte oder ein vollständig verwaltetes VPS mit cPanel für Umgebungen, in denen Sie eine grafische Oberfläche neben dem Shell-Zugang wünschen.

Für Teams, die datenintensive Workloads oder Machine-Learning-Pipelines betreiben, sind Bash-Skripte gleichermaßen wertvoll für die Orchestrierung von Jobs auf GPU Hosting-Infrastruktur – zur Automatisierung von Modelltrainingsläufen, Verwaltung von Datensätzen und Handhabung der Umgebungseinrichtung.

Fazit

Bash-Scripting ist eine unverzichtbare Fähigkeit für jeden, der mit Linux arbeitet – ob Sie ein Anfänger sind, der seine erste wiederkehrende Aufgabe automatisiert, oder ein erfahrener Systemadministrator, der komplexe Server-Infrastrukturen verwaltet. Die in diesem Leitfaden behandelten Konzepte – Dateierstellung, Variablen, Bedingungen, Schleifen, Funktionen, Argumentbehandlung, Fehlerverwaltung und Debugging – bilden das vollständige Fundament, das Sie benötigen, um zuverlässige, produktionsreife Skripte zu schreiben.

Fangen Sie klein an: Automatisieren Sie eine Aufgabe, die Sie täglich manuell ausführen. Wenn Ihr Vertrauen wächst, kombinieren Sie diese Bausteine zu immer ausgefeilteren Werkzeugen, die Stunden an Arbeit einsparen, das Risiko menschlicher Fehler reduzieren und Ihnen präzise, wiederholbare Kontrolle über Ihre Systeme geben.

Für die beste Umgebung zum Üben und Bereitstellen Ihrer Bash-Skripte erkunden Sie AlexHosts Palette an Linux-basierten VPS Hosting-Plänen – mit vollem root-Zugang, SSD-Speicher und flexiblen Konfigurationen, die für Entwickler und Systemadministratoren konzipiert sind.

15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen