Eine andere Technik, die Sie in Bash und einigen anderen Shells verwenden können, ist die Verwendung eines Arrays:
$ extensions=(foo bar)
$ ls "${extensions[@]/#/1.}"
Dies ist die
(Mustersubstitutions-) Form der Parametererweiterung. (Leider ist dies auch nicht POSIX-kompatibel.) Das gibt an, dass die Substitution auf jedes Element des Arrays angewendet werden soll und dass die Trennung zwischen den Elementen beibehalten werden soll.
in einem Muster wirkt die Zeichenfolge wie ein regulärer Ausdruck (dh die meisten Substitutionen); Dies bedeutet, dass die Ersetzung nur am Anfang der Parameterwerte erfolgen sollte. Damit${parameter/pattern/string}
[@]
#
^
s/old/new/
$ ls "${extensions[@]/#/1.}"
ist äquivalent zu
$ ls "$ {extensions [ 0 ] / # / 1.}" "$ {extensions [ 1 ] / # / 1.}"
(da dieses Array zwei Elemente hat, die als 0 und 1 indiziert sind) und dies erweitert sich auf
$ ls "1.foo" "1.bar"
Zitieren
Die Anführungszeichen sind wichtig, wenn für die „Erweiterungen“ Anführungszeichen erforderlich sind, dh wenn sie (möglicherweise jemals) Leerzeichen oder Zeichen zur Erweiterung des Pfadnamens (Glob / Wildcard) enthalten. Zum Beispiel wenn
$ extensions=("foo bar" "*r")
dann
$ ls ${extensions[@]/#/1.}
(ohne Anführungszeichen) würde auf erweitern
$ ls 1.foo bar 1.*r
(in denen 1.foo
und bar
sind separate Argumente), und dies wiederum erweitert sich auf
$ ls 1.foo bar 1.anteater 1.bar 1.bear 1.cougar 1.deer 1.grasshopper …
(weil 1.*r
es sich um einen nicht zitierten Platzhalter handelt). Weitere Informationen zur Wichtigkeit des Zitierens finden Sie unter Auswirkungen auf die Sicherheit, wenn Sie vergessen, eine Variable in Bash / POSIX-Shells zu zitieren .
Sie können das Ende einer Zeichenfolge auch mit %
dem folgenden Muster abgleichen :
$ fnames=(cat dog)
$ ls "${fnames[@]/%/.c}"
erweitert sich auf
$ ls "cat.c" "dog.c"
Aber Vorsicht: Funktioniert %
nicht wie $
in regulären Ausdrücken. Sie müssen es am Anfang des Musters
einfügen, um die Übereinstimmung am Ende des Parameterwerts einzuschränken. Zum Beispiel, wenn Sie haben
$ fnames=(cat.c dog.c)
und Sie bekommen cat.o
und dog.o
,
nicht tun "${fnames[@]/.c%/.o}"
- es wird nicht funktionieren. Tun
$ ls "${fnames[@]/%.c/.o}"
Aber tun Sie es auch nicht "${fnames[@]/.c/.o}"
(lassen Sie das %
Ganze weg) - wenn einer der „fnames“ ist dog.catcher.c
, wird er in konvertiert
(da der erste durch ersetzt wird ).dog.oatcher.c
.c
.o
Leider gibt es keine einfache Möglichkeit, ein Präfix und ein Suffix hinzuzufügen, wie Sie es könnten
$ ls 1.{foo,bar}.c
Weitere Informationen zu Variablen, Arrays und den Transformationen, die Sie auf sie anwenden können, finden Sie in der Bash-Dokumentation.