
Bash Parametersubstitution
20. Nov 2009, 14:02
Ich wollte gerade die Endungen von allen Dateien eines Ordners ändern und musste natürlich erstmal wieder im Netzn suchen. Um das ganze für das nächste Mal zu optimieren gibt's hier eine kleine Gedankenstütze.
Das ganze nennt sich Parametersubstitution und funktioniert wie folgt:
1
for i in `ls *.ALT`; do echo ${i/.ALT/}.NEU; done
ändert also alle Dateien mit der Endung .ALT in .NEU.
Außer /.../
gibt es noch die folgenden Substitutionen:
${#var}
- Liefert die Anzahl der Zeichen in
$var
. ${var#muster}
- Wird
muster
in$var
gefunden, wird der Inhalt von$var
ab dem ersten Zeichen nach dem ersten Muster zurück gegeben. Bei Missmatch wird der gesamte Inhalt der Variablen geliefert. ${var%muster}
- Der umgekehrte Fall von oben, es wird der Inhalt von
$var
bis zum ersten gefunden Muster geliefert, oder wenn nichts gefunden wird, der komplette Inhalt von$var
. ${var##muster}
bzw.${var%%muster}
- Wie die letzen beiden Fälle, jedoch wird das Muster von hinten gesucht. Es wird also das letzte gefundene Muster genutzt.
${var:-default}
- Liefert
default
zurück, wenn$var
leer ist, ansonsten$var
.$var
bleibt auf jeden Fall unverändert! ${var:=default}
- Liefert
default
zurück, wenn$var
leer ist, ansonsten$var
. Ist$var
leer, bekommt$var
den Wertdefault
. ${var:+neu}
- Wenn
$var
leer ist, bleibt$var
unverändert, sonst wird$var
auf neu gesetzt und der Wert zurück gegeben. ${var:?error}
- Wenn
$var
leer ist, wird der Name der Variablen underror
ausgegeben, das Script wird beendet. Im anderen Fall wird einfach der Inhalt von$var
zurück gegeben.
Ist natürlich nur für die Bash aktuell, in wie weit andere Shells damit umgehen könnten bleibt ungewiss ;-)