- 1 Section
- 10 Lessons
- unbegrenzt
- Bash / Shell-Scripting10
- 1.1Was ist eine Shell? bash, sh, zsh im Vergleich
- 1.2Grundlegende Befehle: cd, ls, cp, mv, rm, grep
- 1.3Variablen, Eingabe und Ausgabe
- 1.4Kontrollstrukturen: if, case, for, while
- 1.5Funktionen und Argumente
- 1.6Fehlerbehandlung: exit codes, trap
- 1.7Textverarbeitung: sed, awk, cut, sort
- 1.8Dateisystem-Automation: find, xargs, cron
- 1.9Netzwerk-Scripting: curl, ssh, rsync
- 1.10Praxisprojekt: Systemstatus- und Backup-Script
Praxisprojekt: Systemstatus- und Backup-Script
Du hast in den vorigen neun Lektionen alle Bausteine kennengelernt: Befehle, Variablen, Kontrollstrukturen, Funktionen, Fehlerbehandlung, Textverarbeitung, find/cron und curl/ssh/rsync. Jetzt fügen wir alles zu einem echten Projekt zusammen: ein Systemstatus- und Backup-Skript, das du auf jedem Linux-Server einsetzen kannst.
Wir bauen es in mehreren Iterationen auf – das ist auch die professionelle Arbeitsweise. Erst eine simple Version die funktioniert, dann nach und nach Härtung, bessere Fehlerbehandlung, Konfiguration. Jede Iteration ist lauffähig. Am Ende hast du ein Skript das produktionstauglich ist und gleichzeitig zeigt wie ein FISI Bash-Projekte angeht.
1) Anforderungen festlegen
Bevor wir Code schreiben: was soll das Skript eigentlich können? Anforderungen klar zu formulieren ist der wichtigste Schritt in jedem Software-Projekt:
2) Iterative Entwicklung – fünf Stufen
Wir bauen das Skript in fünf Stufen auf. Jede Stufe ist lauffähig und löst einen Teil der Anforderungen. Klick durch die Iterationen:
3) Iteration v1: der Prototyp
Wir fangen ganz simpel an. Das hier ist das absolute Minimum was funktioniert:
Was ist hier dabei? Drei Variablen für Quelle, Ziel, Datum. mkdir -p erstellt den Backup-Ordner falls nötig. tar -czf komprimiert die Quelle in ein Archiv. echo bestätigt den Erfolg. Lauffähig, aber: was wenn die Quelle nicht existiert? Was wenn die Platte voll ist? Antwort: das Skript würde kryptisch abstürzen. Genau das fixen wir als nächstes.
4) Iteration v2: strikter Modus und Argumente
Statt Variablen hardzucoden nehmen wir sie als Argumente. Plus die goldene Trinity aus L6:
Schon viel besser. Wenn jetzt etwas schiefgeht, kriegt der User eine klare Meldung statt einem kryptischen tar-Fehler. set -euo pipefail sorgt dafür dass bei JEDEM Befehl der fehlschlägt sofort abgebrochen wird. Exit-Codes sind dokumentiert: 2 = falsche Args, 3 = Quelle fehlt.
5) Iteration v3: Funktionen und Logging
Jetzt wird's strukturiert. Wir zerlegen den Code in benannte Funktionen, fügen Logging hinzu und kümmern uns um die Aufbewahrung alter Backups:
Vier Funktionen mit klaren Aufgaben. Die log()-Funktion schreibt mit tee gleichzeitig auf Terminal UND in die Logdatei. system_info nutzt die Klassiker hostname, uptime, df, free kombiniert mit awk aus L7. cleanup nutzt find -mtime +N -delete aus L8.
Wenn du das ausführst, sieht es etwa so aus:
[2026-05-17 14:32:01] INFO: === Backup-Lauf gestartet ===
[2026-05-17 14:32:01] INFO: Host: server01
[2026-05-17 14:32:01] INFO: Uptime: up 12 days, 4 hours
[2026-05-17 14:32:01] INFO: Disk: 142G frei von 250G
[2026-05-17 14:32:01] INFO: RAM: 5.2G verfügbar
[2026-05-17 14:32:01] INFO: Backup: /home/anna/projekte → /backup/projekte_2026-05-17_1432.tar.gz
[2026-05-17 14:32:08] INFO: Backup fertig: 145M
[2026-05-17 14:32:08] INFO: Lösche 2 alte Backups (älter 7 Tage)
[2026-05-17 14:32:08] INFO: === Backup-Lauf erfolgreich beendet ===
6) Iteration v4: Konfiguration und Robustheit
Was wenn das Skript auf 10 Servern laufen soll, jeder mit anderer Konfiguration? Wir lagern Settings in eine Datei aus und schützen vor parallelen Läufen:
Eine zugehörige Konfig /etc/backup.conf:
Das Schöne: dasselbe Skript für mehrere Backup-Jobs! Einfach mehrere Configs anlegen und mit BACKUP_CONFIG=/etc/backup-www.conf ./backup-v4.sh die richtige auswählen. trap cleanup EXIT sorgt für Lock-Entfernung selbst bei Strg+C oder Crash. Pflicht-Variablen werden mit ${VAR:?Fehlermeldung} aus L3 Parameter-Expansion geprüft.
7) Iteration v5: Production-Ready
Die finale Version mit allem drum und dran. Schöner Header mit Doku, Statusmail, klar dokumentierte Exit-Codes:
Das ist Production-Code. Lesbar, getestet, fehlertolerant. Die err()-Funktion schickt bei Fehlern eine Mail an den Admin (falls in Config gesetzt). Die cleanup()-Funktion loggt sogar Skript-Abbrüche. Alle Exit-Codes sind im Header dokumentiert.
8) ShellCheck-Test
Bevor wir das Skript live schalten: shellcheck drüber laufen lassen (siehe L6):
(keine Ausgabe = keine Warnungen)
$ echo $?
0
$ bash -n backup.sh # Syntax-Check
(keine Ausgabe = Syntax OK)
shellcheck ohne Output ist das Ziel. Sollten Warnungen kommen: ernst nehmen, sind fast immer echte Probleme. bash -n macht einen reinen Syntax-Check ohne Ausführung – schnelle Sanity-Prüfung.
9) Cron-Einrichtung
Das Skript ist fertig – jetzt soll es automatisch laufen. crontab -e öffnen und eintragen:
Sicherheits-Checkliste vor dem Live-Gehen:
- Skript an einem Test-Verzeichnis ausprobieren (NICHT mit Produktiv-Daten zuerst!)
- Mit
--dry-run-Modus (selbst eingebauen) erst „simulieren" lassen - Restore-Test: kann ich aus dem Backup auch wirklich wiederherstellen?
- Logfile prüfen: füllt es sich? Werden Fehler korrekt erfasst?
- Disk-Space-Monitoring: Backup-Platte hat Reserve?
- Aufbewahrung-Logik testen: alte Backups werden wirklich gelöscht?
10) Erweiterungs-Ideen
Was könnte man noch einbauen?
- Inkrementelle Backups mit
rsync --link-dest– nur Änderungen kopieren, alte bleiben per Hardlink referenziert. - Off-Site-Backup mit
rsyncoderscpauf einen entfernten Server (siehe L9). - Verschlüsselung via
gpgoderopenssl– wichtig wenn Backups auf fremden Servern liegen. - Slack/Teams-Benachrichtigung via Webhook statt Mail.
- Backup-Prüfung: nach dem tar einen Test-Auspacken machen, prüfen ob Dateigrößen stimmen.
- Metrik-Export: Prometheus-Pushgateway für Monitoring-Integration.
- Datenbank-Dumps: vor dem tar erst
mysqldumpoderpg_dumplaufen lassen. - Multi-Quellen: nicht nur ein Verzeichnis, sondern Liste in Config.
Spätestens wenn das Skript > 200 Zeilen wird, lohnt sich der Wechsel zu Python. Für richtig große Setups gibt es spezialisierte Tools: BorgBackup, Restic, Bacula. Aber für 80% der FISI-Aufgaben reicht so ein Bash-Skript völlig – und du verstehst genau was passiert. Mehr zu professionellen Backup-Konzepten in K58 Backup-Strategien.
11) Die Bash-Säulen – Rückblick auf den Kurs
Du hast in diesem Kurs alle wichtigen Bash-Konzepte kennengelernt. Hier nochmal als Übersicht – jedes Konzept war in diesem Projekt sichtbar:
12) Wie es weitergeht
Bash ist nur ein Werkzeug von vielen. Die nächsten Schritte für FISI:
- K29 Linux-Serveradministration – Bash anwenden auf realen Servern: Users, Services, Logging, Netzwerk-Stack.
- K54 CI/CD – Bash-Skripte landen oft in GitLab CI oder GitHub Actions Pipelines.
- K32 Docker – Dockerfiles enthalten Bash-Code, Entrypoint-Skripte sind Bash.
- K44 PowerShell – Das Windows-Pendant zu Bash. Andere Philosophie (objektbasiert), aber ähnliche Konzepte.
- K41 Python – Für alles was über Bash hinausgeht. Komplexere Datenstrukturen, REST-APIs, Tests.
- Konfigurationsmanagement – Ansible, Puppet, Chef. Skalieren Bash-Patterns auf 100+ Server.
Übe Bash am besten direkt am eigenen System: schreibe kleine Skripte für Dinge die du regelmäßig manuell machst. Foto-Sortierer? Log-Aufräumer? Status-Dashboard? Jedes davon ist eine perfekte Übung. Innerhalb weniger Wochen wirst du merken: was vorher 10 Minuten Klicken war, ist jetzt ein Tipper. Das ist die echte Macht der Shell.
Zusammenfassung
In diesem Projekt haben wir ein produktionstaugliches Backup-Skript in 5 Iterationen aufgebaut: v1 minimal, v2 mit Argumenten + strikter Modus, v3 mit Funktionen + Logging, v4 mit Config + trap + Lock, v5 production-ready mit Mail-Benachrichtigung und Doku. Iterative Entwicklung ist Standard – nicht alles auf einmal! Wichtige Prinzipien: set -euo pipefail immer, alle Funktionen mit local-Variablen, Konfiguration über separate Datei mit source, trap cleanup EXIT für Lock-Files, Logging mit Zeitstempeln, klare Exit-Codes im Header dokumentieren, mit ShellCheck prüfen, vor Live-Gang im Test-Setup ausprobieren, Cron-Einbindung über crontab -e. Alles aus diesem Kurs floss zusammen: Befehle (L2), Variablen (L3), Kontrollstrukturen (L4), Funktionen (L5), Fehlerbehandlung (L6), Textverarbeitung (L7), find/cron (L8), Mail (L9). Bash ist dein Werkzeug für tägliche Automatisierung – produktiv mit kleinen Schritten am eigenen System trainieren!
