Zum Inhalt springen

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.

Die Tilde ~ wird durch das Heimverzeichnis des aktuellen Benutzers ersetzt:

/home/alice
echo ~
echo ~/dokumente
# /home/alice/dokumente
echo ~root
# /root

Variablen werden mit $ oder ${...} referenziert. Die Shell ersetzt den Ausdruck durch den aktuellen Wert der Variablen:

/home/alice
echo $HOME
echo $USER
# alice
echo $SHELL
# /bin/bash

Die geschweifte Klammerform ${VAR} ist nötig, wenn direkt dahinter noch Text folgt:

Terminal-Fenster
VERSION=24
echo "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 String
echo "Ubuntu${VERSION}test"
# Ubuntu24test ← korrekt

Variablen werden ohne $ gesetzt, mit $ gelesen:

Terminal-Fenster
NAME="Linux"
echo "Hallo $NAME"
# Hallo Linux
HEUTE=$(date +%F) # Wert einer Variablen per Command-Substitution setzen
echo "Datum: $HEUTE"
# Datum: 2026-03-17

Mit $(...) wird ein Befehl ausgeführt und seine Ausgabe an Ort und Stelle eingesetzt:

Terminal-Fenster
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: 42

Mit $((...)) wertet die Shell einen arithmetischen Ausdruck aus:

Terminal-Fenster
echo $((3 + 4))
# 7
echo $((10 * 5 - 3))
# 47
PREIS=49
MWST=19
echo "Brutto: $(( PREIS * (100 + MWST) / 100 )) €"
# Brutto: 58 €

Anführungszeichen steuern, ob Substitutionen stattfinden:

FormSubstitutionBeispielAusgabe
Kein Quotingjaecho $USERalice
Doppelte Anführungszeichen "..."jaecho "$USER"alice
Einfache Anführungszeichen '...'neinecho '$USER'$USER
Terminal-Fenster
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-17

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:

Terminal-Fenster
set -x
NAME="Welt"
echo "Hallo $NAME, heute ist $(date +%A)"
set +x # Tracing wieder ausschalten

Ausgabe:

+ NAME=Welt
+ date +%A
+ echo 'Hallo Welt, heute ist Dienstag'
Hallo Welt, heute ist Dienstag
+ set +x

Das + 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.