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.
Es gibt 2 Formen:
`command` #alte Form
oder
$(command) # neue Form bash, ksh
$(ls -l) # Directorylisting anzeigen
$(cat /etc/fstab) # Datei /etc/fstab anzeigen
Das Kommando $(cat file) kann durch die schnellere (builtin)
$(< file) ersetzt werden.
$(< /etc/fstab) # Datei /etc/fstab anzeigen
- 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.
Es ist sinnvoll in den Scripts immer {} zu verwenden,
Allgemeine Form Beispiel
${parameter} ${0} Scriptbezeichnung
${1} Erster Übergabeparameter
${feld}
${#parameter} ${#*} Anzahl der übergebenen Parameter
${#@} dto
${#feld} Länge der Valueangabe des
Parameters/Variable Feld
${#parameter[*]} ${#array[*]} Anzahl Elemente 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
Substition
Bei der Substituierung werden Teile des Parameters ersetzt.
Eigentlich ist der : in der Syntax optional.
Ich hatte aber auch schon Probleme, das die bash ihn aber nicht haben wollte.
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,
anschliessend 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
---------------------------------------
line: code : Parameter
1:
|
#!/bin/bash
verz=$(ls test)
echo $*
f2=${2}
echo ${verz}
# ersetze alte Parameter auf den alten Parameter kann jetzt
set test.sh b c d e
#auf den alten Parameter kann jetzt nicht mehr zugegriffen werden
echo $*
echo $3
# Ist der Parameter gesetzt und seine Länge ist nicht Null, so wird word substituiert.
echo ${3+${f2}}
|
detlef@i7-graf-st-dh:~/script_tests$ ./par_sub_1.sh bla blup blubber
bla blup blubber
files.txt leer.txt versuch.txt
test.sh b c d e
c
blup
detlef@i7-graf-st-dh:~/script_tests$
${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