Verkettung und Anhängen von Umgebungsvariablen

Verkettung und Anhängen von Umgebungsvariablen

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 findmein gesucht $foound 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.

verwandte Informationen