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.
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. Dieenv-Variante findet Bash über den PATH — wichtig auf Systemen, wo Bash nicht unter/binliegt. Eine Shebang darf nur ein Argument haben; Optionen kommen deshalb in eine eigeneset-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. Mitpipefailmeldet 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.
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.
- Datei anlegen: Lege eine Datei
skript.shan, z. B. mitnano skript.sh. Schreibe das Grundgerüst von oben hinein. - Erste Befehle ergänzen: Füge unter den Kopf eine Ausgabe ein, etwa
printf '%s\n' "Sicherung startet". Verwendeprintfstattecho— es verhält sich über Distributionen hinweg gleich. - Ausführbar machen: Im Terminal
chmod +x skript.shausführen. Das setzt das Ausführen-Recht; ohne das startet die Datei nicht direkt. - Argumente verarbeiten: Willst du dem Skript Optionen mitgeben (z. B.
-f datei), nutzegetoptsund baue eine kleineusage()-Funktion, die bei falscher Eingabe die Hilfe ausgibt. - In Funktionen gliedern: Packe zusammengehörige Schritte in benannte Funktionen wie
verarbeite_datei()undaufraeumen(). Variablen darin mitlocaldeklarieren, damit sie nicht ungewollt nach außen wirken. - Aufräumen absichern: Mit
trap aufraeumen EXITsorgst du dafür, dass die Aufräum-Funktion auch bei einem Abbruch läuft — etwa um temporäre Dateien zu löschen. - Prüfen lassen: Vor dem ersten echten Lauf
shellcheck skript.shausführen und die gemeldeten Stellen korrigieren (mehr dazu unten). - Starten:
./skript.shaufrufen. Für eine Schritt-für-Schritt-Protokollierung im Fehlerfall hilftbash -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.
| Tool | Aufgabe | Aufruf |
|---|---|---|
| ShellCheck | Statische Analyse: warnt vor falschem Quoting, riskanten Tests und typischen Stolperfallen, bevor das Skript läuft. | shellcheck skript.sh |
| shfmt | Formatiert Skripte automatisch nach einem einheitlichen Stil — wie ein Auto-Format für Shell-Code. | shfmt -w skript.sh |
| bats | Bash 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.echofür formatierte Ausgaben: Verhält sich je nach System unterschiedlich.printfist die verlässliche Wahl.ps-Ausgaben parsen: Vermeide das. Für laufende Prozesse sindpgrepoderpidofsauberer und zuverlässiger.- Globale Variablen überall: Sie erzeugen schwer auffindbare Seiteneffekte. Innerhalb von Funktionen konsequent
localnutzen. - Kein Timeout bei langen Prozessen: Mit
timeout 30s befehlverhinderst 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.
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.




