Linux Bash-Skripte schreiben: der Praxis-Leitfaden

Laptop mit geöffnetem Linux-Terminal und Shell-Code auf dem Schreibtisch eines Entwicklers

Ein Bash-Skript ist eine Textdatei (meist mit Endung .sh), in der du mehrere Shell-Befehle untereinander schreibst — Linux arbeitet sie von oben nach unten ab. Das robuste Grundgerüst sind drei Zeilen: die Shebang #!/usr/bin/env bash, danach set -euo pipefail für den strengen Fehlermodus, dann deine Befehle. Mit chmod +x skript.sh machst du die Datei ausführbar und startest sie über ./skript.sh.

Anzeige

Das Grundgerüst: diese drei Zeilen gehören an jeden Anfang

Bevor irgendein Befehl folgt, brauchst du einen sauberen Kopf. Genau hier entscheidet sich, ob ein Skript bei einem Fehler stur weiterläuft (und Schaden anrichtet) oder kontrolliert abbricht.

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

Was die Zeilen bewirken:

  • Shebang #!/usr/bin/env bash: Sie sagt dem System, mit welchem Interpreter das Skript laufen soll. Die env-Variante findet Bash über den PATH — wichtig auf Systemen, wo Bash nicht unter /bin liegt. Eine Shebang darf nur ein Argument haben; Optionen kommen deshalb in eine eigene set-Zeile, nicht in die Shebang.
  • set -e (errexit): Das Skript bricht ab, sobald ein Befehl mit einem Fehler endet — statt blind weiterzulaufen.
  • set -u (nounset): Der Zugriff auf eine nicht gesetzte Variable löst einen Fehler aus. Das fängt Tippfehler in Variablennamen früh ab.
  • set -o pipefail: In einer Pipe (befehl1 | befehl2) zählt normalerweise nur der Exit-Code des letzten Befehls. Mit pipefail meldet die Pipe auch dann einen Fehler, wenn ein früherer Teil scheitert.
  • IFS=$'\n\t': Setzt den Feldtrenner auf Zeilenumbruch und Tab. So zerlegt Bash Werte nicht versehentlich an jedem Leerzeichen — der häufigste Grund für kaputte Dateinamen mit Leerzeichen.

Anzeige

cshow

Schritt für Schritt zum ersten lauffähigen Skript

Das folgende Vorgehen führt vom leeren Verzeichnis zu einem getesteten Skript. Jeder Schritt ist ein Handgriff.

  1. Datei anlegen: Lege eine Datei skript.sh an, z. B. mit nano skript.sh. Schreibe das Grundgerüst von oben hinein.
  2. Erste Befehle ergänzen: Füge unter den Kopf eine Ausgabe ein, etwa printf '%s\n' "Sicherung startet". Verwende printf statt echo — es verhält sich über Distributionen hinweg gleich.
  3. Ausführbar machen: Im Terminal chmod +x skript.sh ausführen. Das setzt das Ausführen-Recht; ohne das startet die Datei nicht direkt.
  4. Argumente verarbeiten: Willst du dem Skript Optionen mitgeben (z. B. -f datei), nutze getopts und baue eine kleine usage()-Funktion, die bei falscher Eingabe die Hilfe ausgibt.
  5. In Funktionen gliedern: Packe zusammengehörige Schritte in benannte Funktionen wie verarbeite_datei() und aufraeumen(). Variablen darin mit local deklarieren, damit sie nicht ungewollt nach außen wirken.
  6. Aufräumen absichern: Mit trap aufraeumen EXIT sorgst du dafür, dass die Aufräum-Funktion auch bei einem Abbruch läuft — etwa um temporäre Dateien zu löschen.
  7. Prüfen lassen: Vor dem ersten echten Lauf shellcheck skript.sh ausführen und die gemeldeten Stellen korrigieren (mehr dazu unten).
  8. Starten: ./skript.sh aufrufen. Für eine Schritt-für-Schritt-Protokollierung im Fehlerfall hilft bash -x skript.sh, das jeden Befehl vor der Ausführung anzeigt.

Die drei Werkzeuge, die Profis nutzen

Bash hatte lange den Ruf, fehleranfällig und schwer testbar zu sein. Drei freie Tools nehmen dir den Großteil dieser Sorge ab — alle drei lassen sich über die Paketverwaltung deiner Distribution installieren.

Anzeige
ToolAufgabeAufruf
ShellCheckStatische Analyse: warnt vor falschem Quoting, riskanten Tests und typischen Stolperfallen, bevor das Skript läuft.shellcheck skript.sh
shfmtFormatiert Skripte automatisch nach einem einheitlichen Stil — wie ein Auto-Format für Shell-Code.shfmt -w skript.sh
batsBash Automated Testing System: damit schreibst du Unit-Tests für deine Skripte und prüfst sie reproduzierbar.bats tests/

Wer regelmäßig Skripte pflegt, baut shellcheck in eine CI-Pipeline (etwa GitHub Actions) ein, damit jede Änderung automatisch geprüft wird.

Stolperfallen, die Anfängern (und Profis) das Skript zerlegen

  • Unquotierte Variablen: Schreibe "$datei" statt $datei. Ohne Anführungszeichen zerfallen Werte mit Leerzeichen in mehrere Argumente — ShellCheck weist genau darauf hin.
  • [ … ] statt [[ … ]]: Für Vergleiche in Bash ist [[ … ]] robuster und weniger anfällig für Worttrennungs-Probleme.
  • echo für formatierte Ausgaben: Verhält sich je nach System unterschiedlich. printf ist die verlässliche Wahl.
  • ps-Ausgaben parsen: Vermeide das. Für laufende Prozesse sind pgrep oder pidof sauberer und zuverlässiger.
  • Globale Variablen überall: Sie erzeugen schwer auffindbare Seiteneffekte. Innerhalb von Funktionen konsequent local nutzen.
  • Kein Timeout bei langen Prozessen: Mit timeout 30s befehl verhinderst du, dass ein hängender Aufruf das ganze Skript blockiert.

Vor riskanten Aktionen — etwa Massen-Löschungen oder Eingriffen in Systemverzeichnisse — gilt dieselbe Regel wie sonst: erst eine Sicherung der betroffenen Daten, dann das Skript scharf schalten. Teste neue Skripte zuerst mit harmlosen Beispieldaten.

Wann Bash das richtige Werkzeug ist — und wann nicht

Bash glänzt bei der Orchestrierung: andere Programme aufrufen, Dateien verschieben, Systemabläufe koordinieren, kleine Automatisierungen verketten. Genau dafür ist die Shell gemacht, und sie ist auf praktisch jeder Linux-Distribution vorinstalliert.

Die Grenze ist erreicht, sobald es um komplexe Datenformate (JSON, XML), Mathematik jenseits ganzer Zahlen oder Skripte über etwa 500 Zeilen geht. Dann lohnt der Wechsel zu Python oder einer anderen Sprache mehr, als die Shell zu verbiegen. Diese Faustregel erspart dir später viel Wartungsärger.

Zur Aktualität: Im Sommer 2025 erschien Bash 5.3 mit Performance-Verbesserungen und neuen Formen der Befehlssubstitution (${ befehl; }). Für den Einstieg brauchst du diese Neuerungen nicht — das oben gezeigte Grundgerüst funktioniert unverändert auch auf älteren Bash-Versionen. Welche Version installiert ist, zeigt dir bash --version.

Anzeige

Wo du verlässlich nachschlägst

Die maßgebliche Referenz ist das GNU Bash Reference Manual (gnu.org/software/bash/manual). Kompakter und direkt im Terminal verfügbar sind die Man-Pages über man bash. Für Tool-Fragen sind die Projektseiten von ShellCheck die erste Adresse — dort kannst du Skripte sogar online prüfen lassen.

Häufige Fragen

Wie erstelle ich ein Bash-Skript?

Lege eine Textdatei mit Endung .sh an, schreibe als erste Zeile #!/usr/bin/env bash, dann deine Befehle. Mache sie mit chmod +x skript.sh ausführbar und starte sie über ./skript.sh.

Was bewirkt set -euo pipefail?

Es aktiviert den strengen Fehlermodus: -e bricht bei Fehlern ab, -u meldet nicht gesetzte Variablen und -o pipefail erkennt Fehler auch in der Mitte einer Pipe. Zusammen verhindern sie, dass ein Skript nach einem Fehler blind weiterläuft.

Welche Shebang gehört in ein Bash-Skript?

#!/usr/bin/env bash ist die portable Wahl, weil sie Bash über den PATH findet — auch wenn es nicht unter /bin liegt. Optionen wie set -e kommen in eine eigene Zeile, da die Shebang nur ein Argument erlaubt.

Wie prüfe und teste ich ein Bash-Skript?

Mit shellcheck skript.sh findest du Fehler vor dem Lauf, shfmt formatiert den Code einheitlich und mit dem Framework bats schreibst du wiederholbare Tests. Alle drei sind kostenlos über die Paketverwaltung installierbar.

Wann sollte ich statt Bash eine andere Sprache nutzen?

Bash ist ideal zum Verketten von Befehlen und für kleine Automatisierungen. Bei komplexen Datenformaten, echter Mathematik oder Skripten über rund 500 Zeilen ist Python die bessere Wahl.

Anzeige
Marcel Meyer

# wer schreibt hier

Marcel Meyer schraubt seit über zehn Jahren an Rechnern, Netzwerken und Servern — beruflich wie privat. Hier übersetzt er IT-Grundlagen in verständliche Schritte.

→ Mehr über mich

Anzeige



Anzeige