Linux · Tag 3 · Kapitel 06 von 6 · Höhepunkt

Bash-Skripte schreiben

Du hast den ganzen Tag Befehle einzeln eingetippt. Jetzt sammelst du sie in einer Datei, machst sie ausführbar — und kannst ganze Befehlsabfolgen mit einem einzigen Aufruf starten. Das ist der Anfang von Automatisierung. Heute schreibst du dein erstes eigenes Skript.

📚 Kapitel 06 ⏱️ ca. 20 min Theorie + 40 min Lab 🧪 Lab 3.6 🏆 Tages-Höhepunkt
Inhalt dieses Kapitels
6.1

Was ist ein Skript?

Grundlage

Ein Bash-Skript ist nichts anderes als eine Textdatei mit Bash-Befehlen, die Zeile für Zeile abgearbeitet werden, sobald du die Datei ausführst.

GEDANKE „Ich tippe jeden Tag dieselben 5 Befehle nacheinander..." LÖSUNG ┌─────────────────────────────────────────┐ │ morgens.sh │ ├─────────────────────────────────────────┤ │ #!/bin/bash │ │ echo "=== System-Check $(date) ===" │ │ echo │ │ echo "-- Speicher --" │ │ free -h │ │ echo │ │ echo "-- Disk --" │ │ df -h │ │ echo "Fertig." │ └─────────────────────────────────────────┘ Statt 5 Befehle → ein einziger: $ ./morgens.sh
🧠
Warum Skripte?
  • 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
6.2

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.

ZEILE 1 IMMER: #!/bin/bash ▲▲ ││ │└─── ! Bang └──── # Sharp / Hash → zusammen "Shebang" Dahinter: Pfad zum Interpreter /bin/bash → Bash-Shell /bin/sh → POSIX-Shell (sparsamer) /usr/bin/python3 → Python-Skript /usr/bin/env bash → portabler (sucht bash im PATH; env aus Modul 05)
📌
Begriff: Shebang

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.

6.3

echo & Kommentare

Pflicht

echo gibt Text auf dem Bildschirm aus — das wichtigste Werkzeug, um zu sehen, was dein Skript gerade tut.

bash
# 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.

bash
#!/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/
💡
Faustregel: Skript-Anfang dokumentieren

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.

6.4

Skript ausführbar machen

Pflicht

Eine reine Textdatei ist noch kein Programm. Du musst das Execute-Bit setzen (kennst du noch aus Tag 2!). Erinnerung: chmod +x.

bash
# 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
⚠️
Warum ./ 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

bash
# 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
6.5

Befehle nacheinander & Variablen im Skript

Pflicht

Im Skript stehen Befehle untereinander. Bash arbeitet sie von oben nach unten ab. Eine Zeile = ein Befehl.

bash
#!/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 $.

bash
#!/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"
💡
Command Substitution: $(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 min
📧
Mail von Markus Becker

Betreff: 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

📸
Vor dem Lab: Snapshot

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.

Phase 1 — Skript bauen (geführt, 25 min)
🎯
Deine Aufgabe

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.

bash
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:

bash
nano meinErstesSkript.sh

Trag genau diesen Inhalt ein:

bash
#!/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:

bash
chmod +x meinErstesSkript.sh
ls -l meinErstesSkript.sh
./meinErstesSkript.sh

Du solltest jetzt sehen:

  • Hallo als erste Ausgabe
  • Eine Liste der noch vorhandenen Dateien (bmw und opelnissan ist weg, rm -f hat sie gelöscht)
  • Wir haben es geschafft als letzte Ausgabe
🎉

Geschafft. Du hast gerade dein erstes eigenes Bash-Skript geschrieben und ausgeführt. Jetzt geht's um Verstehen — Phase 2.

Phase 2 — Verstehen, was passiert (10 min)
🧠
Deine Aufgabe

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.

  1. Idempotenz: Was passiert, wenn du das Skript ein zweites Mal ausführst? Probiere es aus. Warum funktioniert das zweite Mal trotzdem fehlerfrei?
  2. rm -f: Warum benutzt das Skript rm -f und nicht nur rm? Was wäre ohne -f?
  3. Shebang weglassen: Was wäre passiert, wenn die Zeile #!/bin/bash ganz 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 für schnelle Teilnehmer
📌

Bonus: Erweitere das Skript mit Variablen, Datum und einem nützlichen Backup-Skript.

  1. Variable einbauen: Erweitere das Skript, sodass es am Anfang den Benutzernamen ausgibt: echo "Hallo $USER, das Skript startet..."
  2. 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.

  1. 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"
  2. Mach das Backup-Skript ausführbar und führe es aus. Prüfe mit ls -lh ~/autos-backup-*, ob das Archiv da ist.
bash
# 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
🎉
Lab 3.6 geschafft? — DU BIST ADMIN!

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.

6.6

Typische Anfänger-Fehler

Vorsicht
Fehler 1 — Shebang vergessen

Ohne #!/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.

Fehler 2 — 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.

Fehler 3 — ./ vergessen

Du 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.

Fehler 4 — Leerzeichen bei Variablen-Zuweisung

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.

Fehler 5 — Editor speichert mit falscher Endung

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
  1. Wie heißt die Zeile #!/bin/bash in einem Skript, und welche Funktion erfüllt sie technisch?
  2. Welche drei Schritte brauchst du, um aus einer Textdatei ein ausführbares Skript zu machen?
  3. Warum musst du ./skript.sh tippen statt nur skript.sh?
  4. Was macht $(date +%Y-%m-%d) in einem Skript?
  5. Wie kommentierst du eine Zeile in einem Bash-Skript?
  1. Shebang (manchmal auch Hashbang). Aus Sharp (#) und Bang (!).
  2. (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.
  3. 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.
  4. Command Substitution — der Befehl date wird ausgeführt, und seine Ausgabe (z.B. „2026-05-27") wird an dieser Stelle eingesetzt. Praktisch für Backup-Namen mit Datum.
  5. Mit dem Zeichen # am Zeilenanfang. Alles dahinter wird ignoriert. Auch nach einem Befehl möglich: ls # listet das Verzeichnis.