# Parametersubstitutionen

Die Frage: "Was ist Programmieren?" lässt sich in zwei Worten beantworten: "Werte manipulieren". Die Bash stellt wieder einmal komplexe Mechanismen bereit, um den Inhalt von Zeichenketten zu bearbeiten.

Substitution | Wirkung (Beispiel)
`${var:-default}` | Ist `var` leer, liefert das Konstrukt die Zeichenkette `default` zurück, ansonsten den Inhalt von `var`. `var` bleibt unverändert. Beispiel Einem Shellskript kann optional ein Verzeichnis als erstes Argument übergeben werden. In Abhängigkeit davon soll das Shellskript dorthin wechseln oder im aktuellen Verzeichnis bleiben. Eine mögliche Lösung wäre:
`cd ${1:-./}`
1 ist eine spezielle Shell-Variable.
`${var:=default}` | Wie oben, der Inhalt von `var` wird auf `default` gesetzt, wenn diese leer war.
`${var:+neu}` | Ist `var` leer, bleibt die Variable unverändert, ansonsten wird die Variable mit `neu` belegt und der Wert zurückgeliefert.
`${var:?error}` | Ist `var` leer, wird der Variablennamen und `error` ausgegeben und das Shell-Programm beendet. Ansonsten wird der Inhalt der Variablen zurückgegeben. Beispiel Ein Shellprogramm soll herausfinden, an welchem Terminal ein bestimmter Nutzer angemeldet ist. Dazu muss dem Shellskript die Nutzerkennung als Argument übergeben werden. Das Shellprogramm terminiert mit einer Fehlermeldung, wenn das Argument fehlt:
`user=${1:?"Usage: $0 <username>"}`
`${#var}` | Liefert die Anzahl der Zeichen in `var`.
`${var#muster}` | Mustervergleich, beginnend am Anfang der Variablen. Wird das Muster gefunden, wird der Inhalt der Variablen ab dem ersten Zeichen nach dem ersten gefundenen Muster zurückgegeben. Ist das Muster nicht enthalten, wird der Inhalt der Variablen geliefert. Beispiel
`user@sonne> i="archi~01.gz" user@sonne> tmp=${i#*~} user@sonne> echo $tmp 01.gz`
`${var%muster}` | Wie oben, der Vergleich beginnt am Ende der Variablen. Geliefert wird, falls das Muster enthalten ist, alles vom Beginn des Variableninhaltes bis zum ersten Zeichen vor dem Muster. Beispiel
`user@sonne> echo $tmp 01.gz user@sonne> echo ${tmp%.*} 01`
    ${var##muster}

    ${var%%muster}
| Die beiden zuletzt genannten Mechanismen substituieren jeweils das erste auftretende Muster. Es lässt sich ebenfalls das längstmögliche Muster eliminieren:
`user@sonne> dat=/home/user/text.ps.tgz user@sonne> echo ${dat##*/} text.ps.gz user@sonne> echo ${dat%%.*} /home/user/text`