Inhalt dieses Kapitels
Was ist ein Skript?
GrundlageEin Bash-Skript ist nichts anderes als eine Textdatei mit Bash-Befehlen, die Zeile für Zeile abgearbeitet werden, sobald du die Datei ausführst.
- Wiederholbar — die gleiche Aufgabe macht das Skript jedes Mal exakt gleich
- Schnell — ein Aufruf statt 10 Befehle tippen
- Dokumentation — das Skript IST die Anleitung
- Automatisch — kann zeitgesteuert per cron laufen
- Teilbar — Kollege kann dein Skript einfach übernehmen
Die Shebang — #!/bin/bash
Pflicht
Jedes anständige Bash-Skript beginnt mit einer Shebang-Zeile (sprich: „schi-bäng"). Sie sagt dem System, mit welchem Interpreter die Datei ausgeführt werden soll.
Der Begriff lautet Shebang (manchmal auch „Hashbang" genannt). Aus Sharp + Bang (# + !). Steht immer in der ersten Zeile, ohne Leerzeichen davor.
▶ Warum überhaupt eine Shebang?
Wenn du ./skript.sh aufrufst, weiß der Kernel sonst nicht,
welches Programm die Datei interpretieren soll. Die Shebang sagt es ihm.
Ohne Shebang läuft das Skript trotzdem, wenn du es mit
bash skript.sh startest — dann sagst du selbst, womit.
Aber das ist unpraktisch. Mit Shebang reicht ./skript.sh.
echo & Kommentare
Pflicht
echo gibt Text auf dem Bildschirm aus — das wichtigste
Werkzeug, um zu sehen, was dein Skript gerade tut.
# Einfacher Text
echo "Hallo Welt"
# → Hallo Welt
# Variable einbauen
name="Tim"
echo "Hallo $name"
# → Hallo Tim
# Leere Zeile
echo ""
# Ohne Zeilenumbruch am Ende
echo -n "Lade..."
# Mit Escape-Sequenzen (-e)
echo -e "Zeile 1\nZeile 2"
Kommentare
Alles nach # wird ignoriert (außer in der Shebang-Zeile,
die ist Sonderfall). Gut, um zu erklären, was das Skript macht.
#!/bin/bash
# Mein erstes Skript
# Autor: Tim Schulz, HanovaTech
# Datum: 27.05.2026
echo "Hallo Welt" # gibt einen Gruß aus
# Hier kommt der Backup-Teil
tar -czf backup.tar.gz /home/admin/
Schreib in den ersten 3–5 Zeilen (nach der Shebang) als Kommentar rein: Was macht das Skript?, Wer ist der Autor?, Wann zuletzt geändert?. In sechs Monaten weißt du sonst nicht mehr, was das war.
Skript ausführbar machen
PflichtEine reine Textdatei ist noch kein Programm. Du musst das
Execute-Bit setzen (kennst du noch aus Tag 2!).
Erinnerung: chmod +x.
# Skript anlegen
nano mein_skript.sh
# Rechte prüfen — noch NICHT ausführbar
ls -l mein_skript.sh
# → -rw-r--r-- ← kein x irgendwo!
# Ausführbar machen
chmod +x mein_skript.sh
# Jetzt:
ls -l mein_skript.sh
# → -rwxr-xr-x ← x da, für alle drei Gruppen
# Ausführen
./mein_skript.sh
# Punkt-Slash, weil "." (aktuelles Verzeichnis) NICHT im PATH ist
./ vor dem Skript-Namen?Aus Sicherheitsgründen liegt das aktuelle
Verzeichnis (.) nicht im PATH. Sonst
könnte ein Angreifer ein bösartiges Skript namens ls
irgendwo platzieren, und du würdest es aus Versehen ausführen.
Deswegen: bei lokalen Skripten ./skript.sh tippen.
Wenn dich das nervt, leg das Skript in ~/skripte/
und nimm das in den PATH auf (Kapitel 05) — dann reicht
skript.sh.
Alternativen zu chmod +x
# Variante 1: Execute-Bit setzen, dann normal ausführen
chmod +x mein_skript.sh
./mein_skript.sh
# Variante 2: Explizit mit bash starten — geht OHNE +x
bash mein_skript.sh
# Variante 3: Oktal-Rechte setzen (kennst du aus Tag 2)
chmod 755 mein_skript.sh # rwx für Owner, rx für Group/Others
Befehle nacheinander & Variablen im Skript
PflichtIm Skript stehen Befehle untereinander. Bash arbeitet sie von oben nach unten ab. Eine Zeile = ein Befehl.
#!/bin/bash
# Beispiel: drei Befehle nacheinander
echo "Schritt 1: Wechsele in /tmp"
cd /tmp
echo "Schritt 2: Liste Inhalt"
ls -la
echo "Schritt 3: Fertig"
Variablen im Skript
Genau wie in der Shell — Variablen setzen mit = (keine
Leerzeichen!), auslesen mit $.
#!/bin/bash
# Variablen im Skript
# Variable setzen
name="Tim"
ordner="/home/admin/projekte"
datum=$(date +%Y-%m-%d) # Befehl in Variable speichern!
# Ausgeben
echo "Hallo $name"
echo "Arbeitsordner: $ordner"
echo "Heute ist $datum"
# In Befehlen verwenden
cd $ordner
echo "Ich bin jetzt in $PWD"
$(befehl)Mit $(...) kannst du die Ausgabe eines Befehls
in eine Variable speichern. Beispiel:
datum=$(date +%Y-%m-%d) → die Variable
$datum enthält das heutige Datum.
Sehr nützlich für Backup-Skripte:
backup_name="backup-$(date +%Y-%m-%d).tar.gz"
Lab 3.6 — Dein erstes Skript
Höhepunkt · 40 minBetreff: Dein erstes eigenes Skript
Hi Tim,
jetzt der Höhepunkt des Tages: dein erstes eigenes Bash-Skript. Ich gebe dir eine kleine Aufgabe als Übung — eine Datei-Verwaltung, die zeigt, dass du Befehle in eine Datei packen, mit Berechtigungen arbeiten und das Ergebnis prüfen kannst.
Mach die Snapshot-Sicherung vor-skript, bevor du
anfängst — das Skript löscht Dateien.
Das Lab ist diesmal anders aufgebaut: Phase 1 führt dich Schritt für Schritt durchs Skript-Schreiben — beim ersten Mal soll niemand im Dunkeln tappen. Phase 2 ist offen: du gehst dein eigenes Skript durch und beantwortest Reflexionsfragen. Der Bonus ist optional.
Wenn du das hinkriegst, bist du offiziell Skript-fähig. Ab dann ist dein Admin-Leben deutlich entspannter.
— Markus
Bevor du loslegst, mache einen Snapshot
vor-skript in deiner VM. Das Lab löscht Dateien — wenn
du das Skript an der falschen Stelle ausführst, hilft der Snapshot.
Bau dein erstes eigenes Bash-Skript. Diese Phase ist bewusst Schritt für Schritt geführt — beim ersten Skript der Karriere soll niemand im Dunkeln tappen. Phase 2 ist dann offener.
Schritt 1 — Test-Umgebung anlegen
Bevor du das Skript schreibst, brauchst du einen kleinen Test-Ordner mit ein paar Test-Dateien, auf denen das Skript arbeiten soll.
cd ~
mkdir autos
cd autos
touch bmw nissan opel
ls -l
Nach ls -l solltest du drei leere Dateien sehen, alle mit
Standard-Rechten -rw-r--r-- (das ist 644 — du erinnerst dich
aus Tag 2).
Schritt 2 — Skript-Datei schreiben
Bleib im autos-Ordner. Erstelle die Skript-Datei mit
nano:
nano meinErstesSkript.sh
Trag genau diesen Inhalt ein:
#!/bin/bash
# Mein erstes Skript
# Autor: Tim Schulz
# Aufgabe: Datei-Verwaltung im Ordner autos
echo "Hallo"
chmod 644 bmw
rm -f nissan
ls -l
echo "Wir haben es geschafft"
Speichern mit Strg+O, Enter, dann Strg+X zum Verlassen.
Falls du lieber vim nutzt: geht auch.
nano ist nur die Empfehlung, weil es für Anfänger einfacher ist. Beide
erzeugen identische Textdateien — das Skript ist Editor-unabhängig.
Schritt 3 — Ausführbar machen und ausführen
Schau dir zuerst die Rechte deines Skripts an: ls -l meinErstesSkript.sh.
Du wirst sehen, dass das x-Bit fehlt — das Skript ist noch
nicht ausführbar. Setz es mit:
chmod +x meinErstesSkript.sh
ls -l meinErstesSkript.sh
./meinErstesSkript.sh
Du solltest jetzt sehen:
Halloals erste Ausgabe- Eine Liste der noch vorhandenen Dateien (
bmwundopel—nissanist weg,rm -fhat sie gelöscht) Wir haben es geschafftals letzte Ausgabe
Geschafft. Du hast gerade dein erstes eigenes Bash-Skript geschrieben und ausgeführt. Jetzt geht's um Verstehen — Phase 2.
Jetzt geh dein Skript Zeile für Zeile durch. Beantworte die folgenden drei Fragen — selbst nachdenken, dann erst die Lösung aufmachen. Die Hints helfen, wenn du nicht weiterkommst.
- Idempotenz: Was passiert, wenn du das Skript ein zweites Mal ausführst? Probiere es aus. Warum funktioniert das zweite Mal trotzdem fehlerfrei?
- rm -f: Warum benutzt das Skript
rm -fund nicht nurrm? Was wäre ohne-f? - Shebang weglassen: Was wäre passiert, wenn die
Zeile
#!/bin/bashganz gefehlt hätte? Würde das Skript trotzdem laufen?
💡 Hint 1 — Wie teste ich das zweite Ausführen?
Einfach noch einmal ./meinErstesSkript.sh tippen. Schau
dir die Ausgabe an: gibt es eine Fehlermeldung? Beachte: nissan
ist beim ersten Lauf gelöscht worden — was passiert beim zweiten Lauf
mit der Zeile rm -f nissan?
💡 Hint 2 — Was bedeutet -f bei rm?
Das -f steht für force: rm beschwert sich
nicht, wenn die Datei nicht existiert. Ohne -f würde
rm nissan beim zweiten Lauf einen Fehler werfen — und der
Rest des Skripts würde trotzdem weiterlaufen, aber mit Fehler-Exit-Code
am Ende.
💡 Hint 3 — Skript ohne Shebang testen
Du kannst das selbst ausprobieren: kopier dein Skript zu einer Test-Datei
ohne Shebang. cp meinErstesSkript.sh ohne_shebang.sh, dann
in der Kopie die #!/bin/bash-Zeile löschen. Versuche
./ohne_shebang.sh — was passiert? Versuche
bash ohne_shebang.sh — was passiert da?
Frage 1 — Idempotenz: Beim zweiten Lauf läuft das
Skript komplett durch, ohne Fehler. Grund: rm -f nissan
ist idempotent — der Befehl meckert nicht, wenn die Datei
schon weg ist. chmod 644 bmw setzt einfach nochmal die
gleichen Rechte. ls -l und echo sind ohnehin
nur lesend bzw. ausgebend.
Frage 2 — rm -f: -f = force. Ohne wäre
das Skript beim zweiten Lauf nicht mehr fehlerfrei, weil
rm nissan klagen würde: „cannot remove 'nissan': No such
file or directory". Das Skript würde zwar weiterlaufen (Bash bricht
nicht ab), aber der Exit-Code wäre nicht 0 — und in automatisierten
Pipelines ist das ein Problem.
Frage 3 — ohne Shebang: ./skript.sh
funktioniert nicht zuverlässig — der Kernel weiß nicht, mit welchem
Interpreter er die Datei ausführen soll. Auf modernen Systemen
versucht es manchmal die aktuelle Shell, aber das ist Glückssache.
bash skript.sh funktioniert dagegen immer, weil du den
Interpreter explizit angibst. Faustregel: Shebang macht das
Skript portabel und vorhersagbar.
Bonus: Erweitere das Skript mit Variablen, Datum und einem nützlichen Backup-Skript.
- Variable einbauen: Erweitere das Skript, sodass
es am Anfang den Benutzernamen ausgibt:
echo "Hallo $USER, das Skript startet..." - Datum: Füge eine Zeile hinzu, die das aktuelle
Datum ausgibt:
echo "Heute: $(date +%Y-%m-%d)"
Cross-Reference Kap 05: In Lab
3.5 hast du $HOME/skripte/ in deinen $PATH
aufgenommen. Falls du das gemacht hast, kannst du das Backup-Skript
nach dem chmod +x einfach mit backup.sh
aufrufen — ohne ./ davor. Falls nicht, geht
$HOME/skripte/backup.sh auch immer.
- Backup-Skript: Erstelle ein neues Skript
~/skripte/backup.sh, das den autos-Ordner als tar.gz-Archiv ins Home-Verzeichnis sichert. Das Archiv soll das Datum im Namen haben:#!/bin/bash # Backup des autos-Ordners datum=$(date +%Y-%m-%d_%H-%M) backup_name="autos-backup-$datum.tar.gz" echo "Erstelle Backup: $backup_name" tar -czf $HOME/$backup_name $HOME/autos/ echo "Fertig! Backup liegt in $HOME/$backup_name" - Mach das Backup-Skript ausführbar und führe es aus. Prüfe mit
ls -lh ~/autos-backup-*, ob das Archiv da ist.
# 19+20) Skript erweitern
nano meinErstesSkript.sh
# Inhalt komplett:
#!/bin/bash
echo "Hallo $USER, das Skript startet..."
echo "Heute: $(date +%Y-%m-%d)"
chmod 644 bmw
rm -f nissan
ls -l
echo "Wir haben es geschafft"
# 21) Backup-Skript anlegen
mkdir -p ~/skripte
nano ~/skripte/backup.sh
# Inhalt wie in der Aufgabe
# Ausführbar machen
chmod +x ~/skripte/backup.sh
# 22) Ausführen
~/skripte/backup.sh
# Prüfen
ls -lh ~/autos-backup-*
# → -rw-r--r-- 1 admin admin 220 ... autos-backup-2026-05-27_14-35.tar.gz
Glückwunsch! Du hast gerade dein erstes eigenes Programm geschrieben. Genau so fangen alle Admins, Entwickler und DevOps-Engineers an. Aus diesen einfachen Skripten werden später Backup-Pipelines, Deployment-Tools, Monitoring-Skripte — ganze Infrastrukturen.
Wenn du heute Abend nach Hause gehst, weißt du: „Ich kann Befehle in eine Datei schreiben und sie ausführen lassen." Das ist der Übergang vom Klick-Admin zum Skript-Admin. Markus wird stolz sein.
Typische Anfänger-Fehler
VorsichtOhne #!/bin/bash in der ersten Zeile kann das Skript
zwar mit bash skript.sh ausgeführt werden, aber
./skript.sh funktioniert nicht zuverlässig.
Immer mit Shebang anfangen.
chmod +x vergessen„Permission denied" beim Ausführen?
ls -l skript.sh zeigt: kein x in den
Rechten. Lösung: chmod +x skript.sh. Klassiker
Nummer 1 bei Skript-Anfängern.
./ vergessenDu tippst skript.sh und bekommst „command not found",
obwohl die Datei direkt im Verzeichnis liegt. Grund: das aktuelle
Verzeichnis ist nicht im PATH. Immer
./skript.sh bei lokalen Skripten — oder ins
~/skripte/-Verzeichnis legen, das im PATH ist.
name = "Tim" im Skript → Fehlermeldung. Korrekt:
name="Tim" ohne Leerzeichen um das =. Der Fehler
kommt sehr häufig vor, weil normale Programmiersprachen Leerzeichen
ignorieren — Bash nicht.
Manche Editoren speichern als skript.sh.txt, wenn
man nicht aufpasst. Dann findet Bash die Datei nicht. Tipp:
ls -la nach dem Speichern, um den echten Dateinamen
zu sehen.
Kontrollfragen zum Kapitel
Selbst-Check- Wie heißt die Zeile
#!/bin/bashin einem Skript, und welche Funktion erfüllt sie technisch? - Welche drei Schritte brauchst du, um aus einer Textdatei ein ausführbares Skript zu machen?
- Warum musst du
./skript.shtippen statt nurskript.sh? - Was macht
$(date +%Y-%m-%d)in einem Skript? - Wie kommentierst du eine Zeile in einem Bash-Skript?
- Shebang (manchmal auch Hashbang). Aus Sharp (#) und Bang (!).
- (1) Datei mit Befehlen und Shebang erstellen
(z.B. mit nano), (2) Execute-Bit setzen mit
chmod +x skript.sh, (3) Ausführen mit./skript.sh. - Aus Sicherheitsgründen ist das aktuelle Verzeichnis
(
.) NICHT im PATH. Das verhindert, dass du aus Versehen ein bösartiges Skript ausführst, das so heißt wie ein normaler Befehl. - Command Substitution — der Befehl
datewird ausgeführt, und seine Ausgabe (z.B. „2026-05-27") wird an dieser Stelle eingesetzt. Praktisch für Backup-Namen mit Datum. - Mit dem Zeichen
#am Zeilenanfang. Alles dahinter wird ignoriert. Auch nach einem Befehl möglich:ls # listet das Verzeichnis.