
如果我有一個環境變數:
$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: }
剩下的就是歷史了。