环境变量连接和附加

环境变量连接和附加

如果我有一个环境变量:

$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:  }

剩下的就是历史了。

相关内容