Shell-Substitutionen
Bevor die Shell einen Befehl ausführt, wertet sie die Eingabe aus und ersetzt bestimmte Ausdrücke durch ihren berechneten Wert. Dieser Vorgang heißt Substitution (oder Expansion). Das Ergebnis sieht für das aufgerufene Programm so aus, als hätte der Benutzer den ersetzten Wert direkt eingetippt.
echo gibt seine Argumente einfach auf dem Terminal aus – damit lässt sich hervorragend zeigen, was die Shell vor der Ausführung mit einer Eingabe macht.
Tilde-Substitution
Abschnitt betitelt „Tilde-Substitution“Die Tilde ~ wird durch das Heimverzeichnis des aktuellen Benutzers ersetzt:
echo ~echo ~/dokumente# /home/alice/dokumente
echo ~root# /rootVariablen-Substitution
Abschnitt betitelt „Variablen-Substitution“Variablen werden mit $ oder ${...} referenziert. Die Shell ersetzt den Ausdruck durch den aktuellen Wert der Variablen:
echo $HOMEecho $USER# alice
echo $SHELL# /bin/bashDie geschweifte Klammerform ${VAR} ist nötig, wenn direkt dahinter noch Text folgt:
VERSION=24echo "Ubuntu${VERSION}.04"# Ubuntu24.04
# ohne Klammern würde die Shell nach der Variable $VERSION04 suchen:echo "Ubuntu$VERSION.04"# Ubuntu24.04 ← funktioniert zufällig, weil .04 kein gültiger Variablenname-Anfang ist
echo "Ubuntu$VERSIONtest"# Ubuntu ← $VERSIONtest existiert nicht → leerer Stringecho "Ubuntu${VERSION}test"# Ubuntu24test ← korrektEigene Variablen
Abschnitt betitelt „Eigene Variablen“Variablen werden ohne $ gesetzt, mit $ gelesen:
NAME="Linux"echo "Hallo $NAME"# Hallo Linux
HEUTE=$(date +%F) # Wert einer Variablen per Command-Substitution setzenecho "Datum: $HEUTE"# Datum: 2026-03-17Kommando-Substitution
Abschnitt betitelt „Kommando-Substitution“Mit $(...) wird ein Befehl ausgeführt und seine Ausgabe an Ort und Stelle eingesetzt:
echo $(whoami)# alice
echo "Heute ist $(date +%A), der $(date +%d. %B %Y)"# Heute ist Dienstag, der 17. März 2026
echo "Kernel: $(uname -r)"# Kernel: 6.8.0-51-generic
echo "Dateien hier: $(ls | wc -l)"# Dateien hier: 42Arithmetik-Substitution
Abschnitt betitelt „Arithmetik-Substitution“Mit $((...)) wertet die Shell einen arithmetischen Ausdruck aus:
echo $((3 + 4))# 7
echo $((10 * 5 - 3))# 47
PREIS=49MWST=19echo "Brutto: $(( PREIS * (100 + MWST) / 100 )) €"# Brutto: 58 €Quoting – wann wird substituiert?
Abschnitt betitelt „Quoting – wann wird substituiert?“Anführungszeichen steuern, ob Substitutionen stattfinden:
| Form | Substitution | Beispiel | Ausgabe |
|---|---|---|---|
| Kein Quoting | ja | echo $USER | alice |
Doppelte Anführungszeichen "..." | ja | echo "$USER" | alice |
Einfache Anführungszeichen '...' | nein | echo '$USER' | $USER |
echo "Benutzer: $USER" # Substitution findet statt# Benutzer: alice
echo 'Benutzer: $USER' # alles wörtlich# Benutzer: $USER
echo "Heute: $(date +%F)" # auch Command-Substitution in doppelten Anführungszeichen# Heute: 2026-03-17Shell-Debugging mit set -x
Abschnitt betitelt „Shell-Debugging mit set -x“Wenn unklar ist, was die Shell aus einer Eingabe macht, lässt sich mit set -x das Tracing einschalten. Die Shell gibt dann jede Zeile aus, bevor sie sie ausführt – nach allen Substitutionen:
set -x
NAME="Welt"echo "Hallo $NAME, heute ist $(date +%A)"
set +x # Tracing wieder ausschaltenAusgabe:
+ NAME=Welt+ date +%A+ echo 'Hallo Welt, heute ist Dienstag'Hallo Welt, heute ist Dienstag+ set +xDas + am Zeilenanfang markiert Zeilen, die vom Tracing stammen. Man sieht: Die Shell hat zuerst date +%A ausgeführt und dessen Ausgabe in den echo-Befehl eingesetzt – genau das ist Kommando-Substitution.