11.1 Bash-Scripting Grundlagen
Bash-Scripting Grundlagen
Bash-Skripte sind Textdateien, in denen mehrere Shell-Befehle gespeichert werden.
Statt Befehle immer wieder einzeln in die Shell einzugeben, kann man sie in einem Skript zusammenfassen und wiederholt ausführen.
Für Fachinformatiker Systemintegration ist Bash-Scripting wichtig, weil viele administrative Aufgaben automatisiert werden können.
Beispiele:
- Backups starten
- Logdateien prüfen
- Dienste überwachen
- Dateien aufräumen
- Benutzerinformationen auswerten
- Netzwerkprüfungen durchführen
- wiederkehrende Befehle automatisieren
Merksatz:
Ein Bash-Skript ist eine automatisierte Befehlsfolge.
Lernziele
Nach dieser Seite solltest du erklären können:
- was ein Bash-Skript ist
- was ein Shebang ist
- wie man ein Skript ausführbar macht
- wie Variablen genutzt werden
- wie Parameter übergeben werden
- wie if-Abfragen funktionieren
- wie Schleifen grundsätzlich funktionieren
- was Exit-Codes bedeuten
- warum Kommentare wichtig sind
- wie man einfache Admin-Aufgaben automatisiert
Grundidee
Ein Bash-Skript ist eine normale Textdatei mit Shell-Befehlen.
Beispiel:
echo "Backup startet"
date
df -h
Wenn diese Befehle in einer Datei gespeichert werden, kann man sie später als Skript ausführen.
Typische Dateiendung:
.sh
Beispiel:
backup.sh
Wichtig:
Die Endung .sh ist hilfreich,
aber nicht allein entscheidend.
Entscheidend sind Inhalt,
Rechte
und Ausführung.
Merksatz:
Bash-Skripte bestehen aus Shell-Befehlen.
Warum Skripte nutzen?
Skripte helfen bei:
- Wiederholung
- Automatisierung
- Standardisierung
- Dokumentation
- Fehlervermeidung
- schneller Ausführung
- reproduzierbaren Abläufen
Beispiel:
Statt jeden Tag mehrere Befehle manuell einzugeben,
kann ein Skript diese Befehle automatisch ausführen.
Merksatz:
Skripte machen wiederkehrende Aufgaben wiederholbar.
Ein erstes Skript
Datei erstellen:
nano hallo.sh
Inhalt:
#!/bin/bash
echo "Hallo Linux"
date
whoami
Speichern und schließen.
Ausführbar machen:
chmod +x hallo.sh
Starten:
./hallo.sh
Merksatz:
Skript erstellen,
ausführbar machen,
starten.
Shebang
Die erste Zeile eines Skripts ist häufig der Shebang.
Beispiel:
#!/bin/bash
Bedeutung:
Das Skript soll mit /bin/bash ausgeführt werden.
Alternative:
#!/usr/bin/env bash
Bedeutung:
bash wird über die Umgebung gesucht.
Wichtig:
Der Shebang ist besonders wichtig,
wenn ein Skript direkt gestartet wird.
Merksatz:
Shebang legt fest,
welcher Interpreter das Skript ausführt.
Skript ausführen
Es gibt mehrere Möglichkeiten, ein Skript auszuführen.
Direkt starten:
./script.sh
Dafür braucht das Skript Ausführrecht.
Ausführen mit bash:
bash script.sh
Dafür braucht das Skript nicht zwingend Ausführrecht, weil bash die Datei liest.
Unterschied:
| Startart | Bedeutung |
|---|---|
| ./script.sh | Skript direkt ausführen, Shebang und x-Recht wichtig |
| bash script.sh | Skript mit Bash ausführen |
| sh script.sh | Skript mit sh ausführen, kann anders funktionieren |
Merksatz:
./script.sh nutzt Shebang und Ausführrecht.
bash script.sh nutzt Bash direkt.
Ausführrecht setzen
Ein Skript direkt ausführbar machen:
chmod +x script.sh
Prüfen:
ls -l script.sh
Beispiel:
-rwxr-xr-x script.sh
Das x bedeutet:
ausführbar
Wenn x fehlt, kommt oft:
Permission denied
Merksatz:
Direkt gestartete Skripte brauchen x-Recht.
Aktuelles Verzeichnis und ./ erklären
Wenn man ein Skript im aktuellen Verzeichnis starten möchte, nutzt man:
./script.sh
Bedeutung:
Starte script.sh aus dem aktuellen Verzeichnis.
Warum nicht einfach:
script.sh
Weil das aktuelle Verzeichnis normalerweise nicht im PATH enthalten ist.
Merksatz:
./ bedeutet:
aus dem aktuellen Verzeichnis.
Kommentare
Kommentare erklären, was ein Skript macht.
Kommentarzeilen beginnen mit:
#
Beispiel:
# Dieses Skript zeigt Systeminformationen an
echo "System:"
hostname
Kommentare werden nicht ausgeführt.
Vorteile:
verständlicher
wartbarer
besser für Übergabe
besser für Fehlersuche
Merksatz:
Kommentare erklären den Zweck,
nicht jeden einzelnen offensichtlichen Befehl.
echo
echo gibt Text aus.
Beispiele:
echo "Hallo"
echo "Backup startet"
echo "Aktueller Benutzer: $USER"
Typische Nutzung:
Statusmeldungen
Debug-Ausgaben
einfache Benutzerinformationen
Merksatz:
echo schreibt Text in die Ausgabe.
Variablen
Variablen speichern Werte.
Beispiel:
NAME="Felix"
echo "$NAME"
Wichtig:
Keine Leerzeichen um das Gleichheitszeichen.
Richtig:
NAME="Felix"
Falsch:
NAME = "Felix"
Merksatz:
Variable setzen ohne Leerzeichen.
Variablen verwenden
Variablen werden mit $ angesprochen.
Beispiel:
SERVER="web01"
echo "Servername: $SERVER"
Sicherer Stil:
echo "Servername: ${SERVER}"
Warum?
${SERVER} grenzt den Variablennamen sauber ab.
Merksatz:
$VARIABLE liest den Wert einer Variable.
Anführungszeichen bei Variablen
Variablen sollten meistens in doppelte Anführungszeichen gesetzt werden.
Beispiel:
DATEI="Meine Datei.txt"
cat "$DATEI"
Ohne Anführungszeichen würde die Shell den Dateinamen wegen des Leerzeichens falsch aufteilen.
Merksatz:
Variablen in Skripten meistens quoten:
"$VARIABLE"
Einfache und doppelte Anführungszeichen
| Zeichen | Wirkung |
|---|---|
| " " | Variablen werden ausgewertet |
| ' ' | Variablen werden nicht ausgewertet |
Beispiel:
NAME="Felix"
echo "Hallo $NAME"
Ausgabe:
Hallo Felix
Beispiel:
echo 'Hallo $NAME'
Ausgabe:
Hallo $NAME
Merksatz:
Doppelte Quotes erlauben Variablen.
Einfache Quotes schützen Text.
Befehlsausgabe in Variable speichern
Die Ausgabe eines Befehls kann in einer Variable gespeichert werden.
Beispiel:
HEUTE=$(date)
echo "$HEUTE"
Hostname speichern:
HOST=$(hostname)
echo "System: $HOST"
Merksatz:
$(befehl) speichert Befehlsausgabe.
Parameter an Skripte übergeben
Skripte können Parameter erhalten.
Beispielaufruf:
./backup.sh /home/felix
Im Skript:
echo "Erster Parameter: $1"
Wichtige Parameter:
| Variable | Bedeutung |
|---|---|
| $0 | Name des Skripts |
| $1 | erster Parameter |
| $2 | zweiter Parameter |
| $3 | dritter Parameter |
| $# | Anzahl der Parameter |
| "$@" | alle Parameter einzeln sauber übergeben |
Merksatz:
$1 ist der erste übergebene Parameter.
Beispiel mit Parameter
Skript:
#!/bin/bash
echo "Skriptname: $0"
echo "Erster Parameter: $1"
echo "Anzahl Parameter: $#"
Start:
./test.sh server01
Ausgabe sinngemäß:
Skriptname: ./test.sh
Erster Parameter: server01
Anzahl Parameter: 1
Merksatz:
Parameter machen Skripte flexibel.
Prüfen, ob Parameter fehlt
Beispiel:
#!/bin/bash
if [ -z "$1" ]; then
echo "Fehler: Bitte Dateiname angeben"
exit 1
fi
echo "Datei: $1"
Bedeutung:
-z prüft,
ob eine Zeichenkette leer ist.
Merksatz:
Eingaben prüfen,
bevor das Skript weiterarbeitet.
Exit-Code
Ein Skript kann mit einem Exit-Code beendet werden.
Beispiel:
exit 0
bedeutet:
erfolgreich
Beispiel:
exit 1
bedeutet:
Fehler
Allgemein:
| Exit-Code | Bedeutung |
|---|---|
| 0 | Erfolg |
| ungleich 0 | Fehler oder besonderer Zustand |
Merksatz:
Exit-Code 0 bedeutet Erfolg.
Letzten Exit-Code anzeigen
Nach einem Befehl:
echo $?
Beispiel:
ls /etc
echo $?
Wenn der Befehl erfolgreich war, ist der Exit-Code meist:
0
Wenn der Befehl fehlschlägt, ist er ungleich 0.
Merksatz:
$? enthält den Exit-Code des letzten Befehls.
if-Abfrage
Mit if kann ein Skript Entscheidungen treffen.
Grundstruktur:
if [ Bedingung ]; then
Befehl
fi
Beispiel:
if [ -f "/etc/hosts" ]; then
echo "Datei existiert"
fi
Merksatz:
if führt Befehle abhängig von Bedingungen aus.
if, else und elif
Beispiel:
if [ "$1" = "start" ]; then
echo "Starte Dienst"
elif [ "$1" = "stop" ]; then
echo "Stoppe Dienst"
else
echo "Unbekannter Parameter"
fi
Bedeutung:
| Schlüsselwort | Bedeutung |
|---|---|
| if | wenn |
| elif | sonst wenn |
| else | sonst |
| fi | Ende der if-Abfrage |
Merksatz:
fi beendet die if-Abfrage.
Wichtige Dateitests
| Test | Bedeutung |
|---|---|
| -f DATEI | normale Datei existiert |
| -d PFAD | Verzeichnis existiert |
| -e PFAD | Datei oder Verzeichnis existiert |
| -r DATEI | lesbar |
| -w DATEI | beschreibbar |
| -x DATEI | ausführbar |
| -s DATEI | Datei existiert und ist nicht leer |
Beispiele:
if [ -d "/var/log" ]; then
echo "Logverzeichnis vorhanden"
fi
if [ -x "./script.sh" ]; then
echo "Skript ist ausführbar"
fi
Merksatz:
Dateitests prüfen Pfade und Rechte.
Zeichenketten vergleichen
| Test | Bedeutung |
|---|---|
| "$A" = "$B" | gleich |
| "$A" != "$B" | ungleich |
| -z "$A" | leer |
| -n "$A" | nicht leer |
Beispiel:
if [ "$USER" = "root" ]; then
echo "Du bist root"
fi
Merksatz:
Strings immer in Quotes vergleichen.
Zahlen vergleichen
| Test | Bedeutung |
|---|---|
| -eq | gleich |
| -ne | ungleich |
| -lt | kleiner als |
| -le | kleiner oder gleich |
| -gt | größer als |
| -ge | größer oder gleich |
Beispiel:
ANZAHL=5
if [ "$ANZAHL" -gt 3 ]; then
echo "Mehr als 3"
fi
Merksatz:
Zahlen in Bash mit -eq,
-lt,
-gt vergleichen.
for-Schleife
Eine for-Schleife wiederholt Befehle für mehrere Werte.
Beispiel:
for DATEI in *.log; do
echo "Logdatei: $DATEI"
done
Bedeutung:
Für jede Datei,
die auf .log endet,
wird der Befehl ausgeführt.
Merksatz:
for läuft über eine Liste von Werten.
while-Schleife
Eine while-Schleife läuft, solange eine Bedingung wahr ist.
Beispiel:
ZAHL=1
while [ "$ZAHL" -le 5 ]; do
echo "$ZAHL"
ZAHL=$((ZAHL + 1))
done
Merksatz:
while läuft,
solange die Bedingung stimmt.
case-Abfrage
case eignet sich gut, wenn ein Parameter mehrere mögliche Werte haben kann.
Beispiel:
case "$1" in
start)
echo "Starte"
;;
stop)
echo "Stoppe"
;;
restart)
echo "Starte neu"
;;
*)
echo "Unbekannter Parameter"
exit 1
;;
esac
Merksatz:
case ist übersichtlich für mehrere Auswahlmöglichkeiten.
Rechnen in Bash
Einfache Rechnungen:
ZAHL=5
ERGEBNIS=$((ZAHL + 3))
echo "$ERGEBNIS"
Weitere Beispiele:
A=10
B=2
echo $((A + B))
echo $((A - B))
echo $((A * B))
echo $((A / B))
Wichtig:
Bash rechnet hier ganzzahlig.
Merksatz:
$(( ... )) nutzt arithmetische Auswertung.
read
Mit read kann ein Skript Benutzereingaben lesen.
Beispiel:
echo "Name eingeben:"
read NAME
echo "Hallo $NAME"
Mit Eingabeaufforderung:
read -p "Name: " NAME
Merksatz:
read liest Eingaben vom Benutzer.
Funktionen
Funktionen fassen wiederverwendbare Befehle zusammen.
Beispiel:
check_disk() {
df -h
}
check_disk
Vorteile:
Skript wird übersichtlicher
Wiederholungen werden reduziert
Aufgaben werden gegliedert
Merksatz:
Funktionen machen Skripte strukturierter.
set -e
Mit set -e kann ein Skript beendet werden, wenn ein Befehl fehlschlägt.
Beispiel:
#!/bin/bash
set -e
mkdir /tmp/testordner
cp datei.txt /tmp/testordner/
Wichtig:
set -e kann hilfreich sein,
muss aber bewusst genutzt werden,
weil nicht jeder ungleiche Exit-Code automatisch ein echter Fehler sein muss.
Merksatz:
set -e beendet das Skript bei Fehlern schneller.
set -u
Mit set -u erzeugt die Shell einen Fehler, wenn eine nicht gesetzte Variable verwendet wird.
Beispiel:
set -u
Vorteil:
Tippfehler bei Variablennamen fallen schneller auf.
Merksatz:
set -u schützt vor unbemerkten leeren Variablen.
set -o pipefail
Normalerweise zählt bei einer Pipe oft nur der Exit-Code des letzten Befehls.
Mit:
set -o pipefail
wird ein Fehler innerhalb einer Pipe besser erkannt.
Beispiel:
grep "Fehler" datei.txt | wc -l
Wenn grep wegen fehlender Datei fehlschlägt, soll das Skript dies erkennen können.
Merksatz:
pipefail macht Fehler in Pipes sichtbarer.
Häufiger sicherer Skriptanfang
Ein häufig genutzter sicherer Einstieg ist:
#!/bin/bash
set -euo pipefail
Bedeutung:
| Teil | Bedeutung |
|---|---|
| set -e | bei Fehler abbrechen |
| set -u | nicht gesetzte Variablen als Fehler behandeln |
| set -o pipefail | Fehler in Pipes erkennen |
Wichtig:
Diese Optionen sind nützlich,
aber man muss verstehen,
wie sie wirken.
Merksatz:
set -euo pipefail macht Skripte strenger.
Temporäre Dateien
Skripte sollten temporäre Dateien vorsichtig verwenden.
Besser als feste Namen:
mktemp
Beispiel:
TEMPFILE=$(mktemp)
echo "Test" > "$TEMPFILE"
cat "$TEMPFILE"
rm "$TEMPFILE"
Warum?
eindeutiger Dateiname
weniger Konflikte
sicherer als feste Namen in /tmp
Merksatz:
Temporäre Dateien besser mit mktemp erzeugen.
Skript mit Logausgabe
Beispiel:
#!/bin/bash
LOGDATEI="/tmp/mein-script.log"
echo "Start: $(date)" >> "$LOGDATEI"
df -h >> "$LOGDATEI"
echo "Ende: $(date)" >> "$LOGDATEI"
Merksatz:
Skripte sollten wichtige Aktionen protokollieren.
Beispiel: Speicher prüfen
Ein einfaches Skript:
#!/bin/bash
echo "Speicherprüfung auf $(hostname)"
df -h
Erweitert mit Logdatei:
#!/bin/bash
LOG="/tmp/speichercheck.log"
echo "Prüfung: $(date)" >> "$LOG"
df -h >> "$LOG"
Merksatz:
Kleine Skripte können Admin-Prüfungen automatisieren.
Beispiel: Dienststatus prüfen
Beispiel:
#!/bin/bash
DIENST="ssh"
if systemctl is-active --quiet "$DIENST"; then
echo "$DIENST läuft"
else
echo "$DIENST läuft nicht"
exit 1
fi
Bedeutung:
Das Skript prüft,
ob der Dienst aktiv ist.
Merksatz:
Skripte können Dienstzustände automatisch prüfen.
Beispiel: Datei sichern
Beispiel:
#!/bin/bash
DATEI="/etc/hosts"
BACKUP="/tmp/hosts.backup"
if [ -f "$DATEI" ]; then
cp "$DATEI" "$BACKUP"
echo "Backup erstellt: $BACKUP"
else
echo "Datei nicht gefunden: $DATEI"
exit 1
fi
Merksatz:
Vor Änderungen können Skripte automatisch Sicherungen erstellen.
Cron und Skripte
Skripte können regelmäßig über cron gestartet werden.
Beispielhafte Aufgaben:
tägliches Backup
Logprüfung
Speicherprüfung
Aufräumen temporärer Dateien
Monitoring-Check
Wichtig:
Cron hat oft eine andere Umgebung als die interaktive Shell.
Deshalb in Skripten möglichst:
absolute Pfade nutzen
PATH bewusst setzen
Logs schreiben
Fehlerausgaben umleiten
Merksatz:
Skripte in cron brauchen klare Pfade und Logging.
Typische Fehler in Bash-Skripten
| Fehler | Ursache |
|---|---|
| command not found | Paket fehlt, PATH falsch oder Tippfehler |
| Permission denied | Skript nicht ausführbar oder Rechteproblem |
| Variable leer | nicht gesetzt oder falsch geschrieben |
| Syntax error | Klammer, Quote oder Schlüsselwort fehlt |
| Datei nicht gefunden | relativer Pfad falsch |
| Skript läuft per Hand, aber nicht in cron | andere Umgebung oder PATH |
| if funktioniert nicht | Leerzeichen bei [ ] falsch |
| Schleife verarbeitet Dateinamen falsch | Variablen nicht gequotet |
| Pipe-Fehler bleibt unbemerkt | pipefail fehlt |
| rm löscht zu viel | Variable leer oder Wildcard falsch |
Wichtig bei [ ]
Bei if-Tests mit [ ] sind Leerzeichen wichtig.
Richtig:
if [ "$A" = "$B" ]; then
Falsch:
if ["$A"="$B"]; then
Warum?
[ ist ein eigener Befehl
und braucht getrennte Argumente.
Merksatz:
Bei [ ] müssen Leerzeichen stehen.
Variablen immer quoten
Unsicher:
rm $DATEI
Besser:
rm "$DATEI"
Warum?
Leerzeichen,
Sonderzeichen
oder leere Variablen können gefährlich werden.
Beispiel:
DATEI="Meine Datei.txt"
Ohne Quotes würde die Shell daraus mehrere Argumente machen.
Merksatz:
In Skripten Variablen fast immer in doppelte Quotes setzen.
Relative und absolute Pfade
Ein Skript kann aus verschiedenen Verzeichnissen gestartet werden.
Deshalb können relative Pfade Probleme machen.
Beispiel:
cp config.txt /tmp/
funktioniert nur, wenn config.txt im aktuellen Verzeichnis liegt.
Sicherer:
absolute Pfade verwenden
oder das Skriptverzeichnis bestimmen.
Merksatz:
Skripte sollten nicht blind vom aktuellen Verzeichnis abhängen.
Skripte und Root-Rechte
Manche Skripte brauchen administrative Rechte.
Beispiele:
Dienste neu starten
Pakete installieren
Dateien unter /etc ändern
Benutzer verwalten
Prüfen, ob Skript als root läuft:
if [ "$EUID" -ne 0 ]; then
echo "Bitte als root oder mit sudo ausführen"
exit 1
fi
Merksatz:
Administrative Skripte sollten Rechte bewusst prüfen.
Skript debuggen
Bash-Skript mit Debug-Ausgabe starten:
bash -x script.sh
Oder im Skript:
set -x
Bedeutung:
Befehle werden beim Ausführen angezeigt.
Ausschalten:
set +x
Merksatz:
bash -x hilft bei der Fehlersuche in Skripten.
ShellCheck
ShellCheck ist ein Werkzeug, das Bash-Skripte auf typische Fehler prüft.
Es erkennt zum Beispiel:
fehlende Quotes
unsichere Variablennutzung
mögliche Syntaxprobleme
ungenutzte Variablen
problematische Konstruktionen
Befehl, falls installiert:
shellcheck script.sh
Merksatz:
ShellCheck hilft,
Bash-Fehler früh zu finden.
Sichere Arbeitsweise beim Scripting
Vor produktiver Nutzung:
Skript in Testumgebung prüfen
mit harmlosen Beispieldaten testen
keine gefährlichen rm-Befehle ohne Prüfung
Variablen quoten
Fehlerbehandlung einbauen
Logs schreiben
Exit-Codes sinnvoll setzen
Backup vor Änderungen erstellen
Pfade bewusst wählen
Rechte prüfen
Merksatz:
Skripte automatisieren auch Fehler,
wenn man sie nicht prüft.
Typische Prüfungsfragen
| Frage | Kurzantwort |
|---|---|
| Was ist ein Bash-Skript? | Textdatei mit Shell-Befehlen |
| Was ist ein Shebang? | legt Interpreter fest |
| Wie macht man ein Skript ausführbar? | chmod +x script.sh |
| Wie startet man ein Skript im aktuellen Verzeichnis? | ./script.sh |
| Was ist $1? | erster Parameter |
| Was ist $#? | Anzahl der Parameter |
| Was ist "$@"? | alle Parameter sauber einzeln |
| Was bedeutet exit 0? | erfolgreich beenden |
| Was bedeutet exit 1? | mit Fehler beenden |
| Was macht if? | Bedingung prüfen |
| Was macht for? | über Werte iterieren |
| Was macht while? | solange Bedingung wahr ist |
| Was macht case? | mehrere Auswahlfälle behandeln |
| Warum Variablen quoten? | Schutz vor Leerzeichen und Aufteilung |
| Warum Logs in Skripten? | Nachvollziehbarkeit |
Typische Prüfungsfallen
| Falle | Richtig denken |
|---|---|
| Shebang vergessen | Skript wird eventuell mit falscher Shell ausgeführt |
| chmod +x vergessen | direktes Starten schlägt fehl |
| ./ vor Skript vergessen | aktuelles Verzeichnis ist meist nicht im PATH |
| Leerzeichen bei Variablen setzen | NAME="Wert", nicht NAME = "Wert" |
| Variablen nicht quoten | Probleme bei Leerzeichen oder leeren Werten |
| [ ] ohne Leerzeichen schreiben | Syntaxfehler |
| relative Pfade blind nutzen | Startverzeichnis kann anders sein |
| cron wie interaktive Shell behandeln | cron hat andere Umgebung |
| Exit-Codes ignorieren | Automatisierung erkennt Fehler nicht sauber |
| rm mit leerer Variable | sehr gefährlich |
| Skript nicht testen | Fehler werden automatisiert |
IHK-sichere Kurzformulierung
Ein Bash-Skript ist eine Textdatei mit Shell-Befehlen, die automatisiert ausgeführt werden können. Die Shebang-Zeile wie #!/bin/bash legt fest, welcher Interpreter verwendet wird. Damit ein Skript direkt gestartet werden kann, benötigt es Ausführrechte, zum Beispiel mit chmod +x script.sh, und wird im aktuellen Verzeichnis mit ./script.sh gestartet. Variablen speichern Werte und sollten in Skripten meist in doppelte Anführungszeichen gesetzt werden. Parameter wie $1, $2 und $# machen Skripte flexibel. Mit if, case, for und while können Bedingungen und Wiederholungen umgesetzt werden. Exit-Codes zeigen Erfolg oder Fehler an und sind wichtig für Automatisierung, Monitoring und cronjobs. Skripte sollten getestet, dokumentiert und mit sinnvoller Fehlerbehandlung geschrieben werden.
Merksätze
Bash-Skript = automatisierte Befehlsfolge.
Shebang legt den Interpreter fest.
#!/bin/bash startet mit Bash.
chmod +x macht Skripte ausführbar.
./script.sh startet Skript aus aktuellem Verzeichnis.
bash script.sh startet Skript über Bash.
Kommentare erklären den Zweck.
echo gibt Text aus.
Variablen speichern Werte.
Keine Leerzeichen beim Setzen von Variablen.
$1 ist der erste Parameter.
$# ist die Anzahl der Parameter.
"$@" steht für alle Parameter sauber einzeln.
$(befehl) speichert Befehlsausgabe.
exit 0 bedeutet Erfolg.
exit 1 bedeutet Fehler.
$? zeigt den letzten Exit-Code.
if prüft Bedingungen.
elif bedeutet sonst wenn.
else bedeutet sonst.
fi beendet if.
for läuft über Werte.
while läuft solange eine Bedingung wahr ist.
case ist gut für mehrere Auswahlmöglichkeiten.
$(( ... )) rechnet ganzzahlig.
read liest Benutzereingaben.
Funktionen strukturieren Skripte.
set -e bricht bei Fehlern ab.
set -u erkennt nicht gesetzte Variablen.
pipefail erkennt Fehler in Pipes besser.
mktemp erzeugt temporäre Dateien sicherer.
Cron hat oft andere Umgebung als die normale Shell.
Variablen in Skripten meistens quoten.
Bei [ ] sind Leerzeichen wichtig.
Skripte immer testen,
bevor sie produktiv laufen.
Skripte automatisieren auch Fehler,
wenn sie falsch geschrieben sind.