aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Tools & DevOps

Ein Bash-Script schreiben: Einstieg in die Automatisierung

Ein Bash-Script ist der praktischste Weg, die Befehle, die du einzeln im Terminal tippst, in einer Datei zu bündeln und auf einmal auszuführen. Wiederkehrende Aufgaben von Hand zu erledigen — Logs auf einem Server bereinigen, Backups erstellen, ein Projekt deployen oder Dutzende Dateien umbenennen — ist sowohl mühsam als auch eine Fehlerquelle. In diesem Artikel lernst du, mit den grundlegenden Bausteinen kleine, aber wirklich nützliche Automatisierungen zu schreiben: Variablen, Bedingungen und Schleifen.

Dein erstes Script: Shebang und Ausführungsrecht

Alles beginnt mit einer Datei. Erstelle eine hallo.sh und setze in die erste Zeile einen Shebang. Diese Zeile sagt dem System, welcher Interpreter die Datei ausführen soll:

#!/usr/bin/env bash
echo "Hallo, Automatisierung!"

Anschließend musst du die Datei ausführbar machen, ihr die Berechtigung erteilen und das Script aufrufen:

chmod +x hallo.sh
./hallo.sh

Die Verwendung von #!/usr/bin/env bash findet den richtigen Interpreter, ohne fest zu codieren, wo bash gerade installiert ist. Vergiss diese erste Zeile nicht; sonst hängt das Script von der Shell ab, die es zufällig aufruft.

Variablen und Benutzereingaben

Wenn du eine Variable definierst, darf kein Leerzeichen um das Gleichheitszeichen stehen. Um den Wert zu lesen, stellst du $ voran und setzt ihn fast immer in doppelte Anführungszeichen:

#!/usr/bin/env bash
name="Aslain"
echo "Willkommen, $name"

# Eine Eingabe vom Benutzer lesen
read -r -p "Wie heißt du? " antwort
echo "Hallo $antwort"

Die doppelten Anführungszeichen sind wichtig: "$datei" zu schreiben verhindert, dass Dateinamen mit Leerzeichen aufgeteilt werden. Sie wegzulassen ($datei) ist eine klassische Fehlerquelle. Um die Ausgabe eines Befehls in eine Variable zu übernehmen, verwendest du $(...):

heute="$(date +%Y-%m-%d)"
echo "Heutiges Datum: $heute"

Bedingungen: if, test und Vergleiche

Automatisierung bleibt ohne die Logik „in diesem Fall tu das" unvollständig. In Bash baust du Bedingungen mit if und eckigen Klammern. Für numerische Vergleiche nutzt du -eq, -gt, -lt; für Zeichenketten = und !=:

#!/usr/bin/env bash
read -r -p "Gib eine Zahl ein: " n

if [ "$n" -gt 10 ]; then
  echo "$n ist größer als zehn"
elif [ "$n" -eq 10 ]; then
  echo "Genau zehn"
else
  echo "$n ist kleiner als zehn"
fi

Datei- und Verzeichnisprüfungen sind das Rückgrat alltäglicher Scripts: -f fragt, ob eine Datei existiert, -d, ob ein Verzeichnis existiert, und -z, ob eine Variable leer ist:

if [ -d "/var/backups" ]; then
  echo "Backup-Verzeichnis ist bereit"
else
  mkdir -p /var/backups
fi

Schleifen: viele Dateien verarbeiten

Bei Schleifen spart Bash die meiste Zeit. Um über die Dateien in einem Ordner zu iterieren, verwendest du for:

#!/usr/bin/env bash
for datei in *.log; do
  echo "Verarbeite: $datei"
  gzip "$datei"
done

Du kannst ihr auch einen Zahlenbereich geben, um eine feste Anzahl von Wiederholungen auszuführen. Wenn du schleifen willst, bis eine Bedingung erfüllt ist, greifst du zu while:

# Von 1 bis 5
for i in {1..5}; do
  echo "Versuch $i"
done

# Eine Datei Zeile für Zeile lesen
while IFS= read -r zeile; do
  echo "Zeile: $zeile"
done < liste.txt

Das Muster IFS= read -r ist der sichere Weg, Zeilen zu lesen: Es bewahrt führende und nachfolgende Leerzeichen und verfälscht keine Backslashes.

Funktionen und Argumente

Wenn ein Script wächst, verbessert das Auslagern wiederkehrender Teile in Funktionen die Lesbarkeit. Auf die an das Script übergebenen Argumente greifst du mit $1, $2 zu, auf alle auf einmal mit $@:

#!/usr/bin/env bash
log() {
  echo "[$(date +%H:%M:%S)] $1"
}

backup() {
  local quelle="$1"
  local ziel="$2"
  cp -r "$quelle" "$ziel" && log "Gesichert: $ziel"
}

backup "$1" "/var/backups"

Die Verwendung von local innerhalb einer Funktion schränkt Variablen auf diese Funktion ein, sodass du den Rest des Scripts nicht versehentlich überschreibst.

Robuste Scripts: Fehlerbehandlung

Professionelle Scripts liefern nicht stillschweigend falsche Ergebnisse. Diese Zeile oben hinzuzufügen sollte zur Gewohnheit werden:

set -euo pipefail

Diese drei Einstellungen arbeiten zusammen: -e stoppt das Script, wenn ein Befehl fehlschlägt, -u wertet die Verwendung einer undefinierten Variable als Fehler, und pipefail fängt den Fehler eines beliebigen Befehls in einer Pipeline ab. Dein Script vor der Auslieferung durch ein statisches Analysewerkzeug wie ShellCheck zu schicken, deckt zudem Anführungszeichen- und Variablenfehler früh auf.

Häufige Fragen

Was ist der Unterschied zwischen bash und sh?

sh bezeichnet die ältere, eingeschränktere POSIX-Shell; bash ist eine Obermenge, die Arrays, [[ ]]-Tests und reichere Syntax bietet. Beginnt dein Script mit #!/usr/bin/env bash, kannst du die Funktionen von Bash bedenkenlos nutzen.

Wie debugge ich mein Script?

Die schnellste Methode ist, es mit bash -x script.sh auszuführen, wodurch jeder Befehl vor seiner Ausführung ausgegeben wird. Alternativ kannst du set -x ins Script setzen und mit set +x abschalten, um nur den verdächtigen Abschnitt zu verfolgen.

Reicht Bash für große Automatisierungen?

Bash ist hervorragend für Dateioperationen und das Verketten von Befehlen. Sobald du jedoch komplexe Datenstrukturen, JSON-Verarbeitung oder umfangreiche Logik brauchst, ist der Umstieg auf eine Sprache wie Python wartbarer. Eine gute Faustregel: Überschreitest du 100 Zeilen mit viel Verzweigungslogik, denke über einen Sprachwechsel nach.

Wenn du wiederkehrende Arbeit automatisieren willst, aber nicht weißt, wo du anfangen sollst, von Server-Scripts bis zu Deploy-Pipelines, nimm Kontakt mit mir auf für ein praxistaugliches Setup.

Bu kategorideki tüm yazılar →

Devamı için