環境變數串聯和追加

環境變數串聯和追加

如果我有一個環境變數:

$foo=/my/path/one:/my/path/two

我該如何設定:

$bar=${foo}/bin

在哪裡:

$bar=/my/path/one/bin:/my/path/two/bin

執行我上面所做的操作只會執行以下操作(第一條路徑上不缺少 /bin ):

$bar=/my/path/one/:/my/path/two/bin

我可以手動設定它,或者在列表中迭代它,但這些看起來毫無理由地複雜。有沒有一種聰明的單行方法來做到這一點?

答案1

我沒看錯,你想要這個:

foo=$(echo $foo | sed -e 's@:\|$@/bin&@g'); echo $foo

答案2

/bin:不是最強大但也許是最簡單的方法是使用參數擴展替換所有冒號:

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

解釋:

該語法${foo}允許您在變數中進行多種搜尋和替換。在本例中,我們使用模式匹配,模式之間以斜線分隔。通常你可能會這樣做:

$(foo/findme/replace}

findme它將在 中查找字串$foo並將其替換為replace

要與 交換冒號x,您可以使用 進行搜索,${foo/:/x/}但要替換所有內容而不僅僅是第一個,您可以在開頭放置兩個斜杠。要在替換中使用斜杠,您需要使用反斜杠對其進行轉義\/

總而言之,這給了我們上面使用的模式(為了清晰起見添加了空格,但它們在現實生活中會破壞它):

          <find>   <replace>
${foo  //   :   /   \/bin:  }

剩下的就是歷史了。

相關內容