如果我有一个环境变量:
$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: }
剩下的就是历史了。