Substitution
Command Substitution
Bei der Command substitution ersetzt der Output des ausgeführten
Kommandos auf Standard-Output den Kommandonamen. Dabei werden alle
new-line am Zeilenende gelöscht.
Das Kommando $(cat file) kann durch die schnellere (builtin)
$(< file>) ersetzt werden.
Es gibt 2 Formen:
`command` #alte Form
oder
$(command) # neue Form bash, ksh
Kommando-Substitutionen dürfen geschachtelt werden
Wenn die Substitution in Gänsefüßchen gesetzt wurde,
erfolgt keine Expandierung von Pfadnamen
Kommando-Substitutions dürfen in beiden Formen geschachtelt werden.
In der alten Form müssen aber die inneren `(backticks) maskiert werden.
Die neue Form ist da wesentlich benutzerfreundlicher.
Besteht der Name des Parameter/Variablen aus mehreren Zeichen, so muss
er in geschweifte Klammern eingeschlossen werden, wenn dahinter ein Buchstabe,
eine Ziffer oder ein Underscrore folgt, das nicht Teil des Namens ist.
Allgemeine Form Beispiel
${parameter} ${0} Scriptbezeichnung
${1} Erster Übergabeparameter
${feld}
${#parameter} ${#*} Anzahl der übergebenen Parameter
${#@} dto
${#feld} Länge der Valueangabe des Parameters Feld
${#parameter[*]} ${#array[*]} Anzahl der Elemente der Tabelle array
${parameter:=word} Defaultvalue zuweisen
${parameter:-word} Defaultvalue benutzen
$parameter:+word} Use alternate Value
${parameter:?word} Display Error if Null or Unset
${parameter:offset} Substring Expansion
${parameter:offset:length} Substring Expansion
substitute Defaults
${parameter:=word} Defaultvalue zuweisen
Diese Form darf nicht auf positional Parameter
angewendet werden.
Ist der Parameter nicht gesetzt oder seine Länge ist
Null, so wird der Parameter auf word gesetzt, an-
schliessend wird substituiert.
print ${d:-$(date +%d.%m.%y)}
10.01.94
print $d
10.01.94
${parameter:-word} Defaultvalue benutzen
Wenn der Parameter gesetzt ist und seine Länge ist
nicht Null, so wird der Parameter substituiert,
andernfalls word . Diese Form kann gut für die
Vergabe von einem Default verwendet werden.
vi ${1:-defdatei}
Wurde eine Datei als Parameter 1 übergeben,
so wird der vi damit aufgerufen, andernfalls
wird defdatei verwendet.
echo ${d:-$(pwd)}
${parameter:+word} Use alternate Value
Ist der Parameter gesetzt und seine Länge ist nicht
Null, so wird word substituiert.
Andernfalls wird nichts substituiert
set a b c
print $3
c
print ${3:+alternate value}
alternate value
print $3
c
${parameter:?word} Display Error if Null or Unset
Wenn NULL oder unset Fehlermeldung ausgeben
Ist der Parameter gesetzt und seine Länge ist nicht
Null, so wird der Parameter substituiert.
Andernfalls wird word ausgegeben und die Shell mit
exit verlassen.
Fehlt word, so wird eine Standardmeldung ausgegeben.
unset a
print ${x:?"Abbruch da Parameter fehlt"}
bash: x: Abbruch da Parameter fehlt
print ${a:?}
bash: a: parameter null or unset
${parameter:offset} Substring Expansion
${parameter:offset:length} Substring Expansion
Expandiert ab dem Offset zu der angegebenen Zeichenlänge
oder bis zum Ende .
length und offset sind arithmetische Ausdrücke.
Length muß dabei zu einem Wert >= 0 expandieren.
Wenn offset negativ ist, wird er vom Ende des Parameters
verwendet.
parameter is @, the result is length positional parameters beginning at offset. If
parameter is an array name indexed by @ or *, the result is the length members of
the array beginning with ${parameter[offset]}. Substring indexing is zero-based
unless the positional parameters are used, in which case the indexing starts at 1.
${!prefix*}
Expands to the names of variables whose names begin with prefix, separated by the
first character of the IFS special variable.
Remove Pattern
remove left pattern
${parameter:#pattern}
Remove small left pattern
Wenn das pattern mit dem Anfang des Inhalts
von parameter übereinstimmt, so wird nur der Rest
des Parameters substituiert, andernfalls wird der
Inhalt des Parameters substituiert.
geraet=/dev/ttyd01
print ${geraet:#/dev/}
ttyd01
$ pwd
/usr/hahn/unix/ksh Hier wir nur der relative Pfad ab dem
$ echo ${PWD:#$HOME} Homedirectory ausgegeben
unix/ksh
$ cd /usr2/user/unix0
$ pwd
/usr2/user/unix0
$ echo ${PWD:#$HOME} Hier wird der gesamte Pfad ausgegeben, da
/usr2/user/unix0 der verdere Teil nicht mit $PWD übereinstimmt
${parameter:##pattern}
remove large left pattern
der größtmögliche passende vordere Teil soll entfernt
werden. Hier wird i.d.R. mit Metazeichen gearbeitet
$ pwd
/usr/hahn/unix/ksh
$ echo ${PWD:##*/} Eignet sich gut, um den reinen Dateinamen
ksh oder das letzte Verzeichnis zu isolieren.
remove right pattern
$parameter:%pattern}
remove small right pattern
Wenn das pattern mit dem Ende des Inhalts
von parameter übereinstimmt, so wird der
vordere Teil des Parameters substituiert.
Mit anderen Worten, der übereinstimmende hintere
Teil wird abgeschnitten.
geraet=/dev/ttyd01
print ${geraet:%/ttyd01}
/dev
$parameter:%%pattern}
remove large right pattern
der größtmögliche passende hintere Teil soll entfernt
werden
Hier wird i.d.R. mit Metazeichen gearbeitet
$ x=usr/hahn/unix/ksh # Achtung kein / am Anfang
$ echo ${x:%%/*} #/gefolgt von beliebigen Zeichen
usr
Der : ist in allen vorstehenden Substitutionen optional.