
Wenn ich eine Umgebungsvariable habe:
$foo=/my/path/one:/my/path/two
Wie kann ich Folgendes einstellen:
$bar=${foo}/bin
Wo:
$bar=/my/path/one/bin:/my/path/two/bin
?
Wenn ich das mache, was ich oben getan habe, passiert nur Folgendes (kein Fehlen von /bin im ersten Pfad):
$bar=/my/path/one/:/my/path/two/bin
Ich kann dies manuell festlegen oder in einer Liste darüber iterieren, aber das scheint grundlos kompliziert zu sein. Gibt es eine clevere Einzeiler-Methode, um dies zu tun?
Antwort1
Verstehe ich richtig, dass Sie Folgendes haben möchten:
foo=$(echo $foo | sed -e 's@:\|$@/bin&@g'); echo $foo
?
Antwort2
Nicht die robusteste, aber vielleicht die einfachste Methode besteht darin, einfach alle Doppelpunkte durch die /bin:
Parametererweiterung zu ersetzen:
foo=/my/path/one:/my/path/two:/my/path/three
noo=${foo//:/\/bin:}/bin
echo $noo
/my/path/one/bin:/my/path/two/bin:/my/path/three/bin
Erläuterung:
Die Syntax ${foo}
ermöglicht Ihnen viele Arten von Suchen und Ersetzen in der Variable. In diesem Fall verwenden wir Mustervergleich, wobei die Muster durch Schrägstriche getrennt sind. Normalerweise würden Sie so etwas tun:
$(foo/findme/replace}
Dadurch wird nach der Zeichenfolge findme
in gesucht $foo
und durch ersetzt replace
.
Um die Doppelpunkte durch zu ersetzen x
, könnten Sie mit suchen, ${foo/:/x/}
aber um alle zu ersetzen und nicht nur den ersten, setzen Sie am Anfang zwei Schrägstriche. Um einen Schrägstrich beim Ersetzen zu verwenden, müssen Sie ihn mit einem Backslash maskieren.\/
Insgesamt ergibt sich daraus das oben verwendete Muster (Leerzeichen wurden der Übersichtlichkeit halber hinzugefügt, würden das Muster in der Realität jedoch zerstören):
<find> <replace>
${foo // : / \/bin: }
Der Rest ist Geschichte.