我一直在看一个附加名为' bin'在$MYPATH
下(可能包含a:b:c
格式的多个值)到$PATH
,解决方案为${MYPATH//://bin:}/bin
,例如:
> MYPATH=/local/a:/local/b
> echo ${MYPATH//://bin:}/bin
/local/a/bin:/local/b/bin
> echo ${MYPATH}/bin # as a bad example, this is not what we want
/local/a:/local/b/bin
如你所见,${MYPATH//://bin:}/bin
效果非常好。
我的问题是这样的参数扩展记录在哪里,我找不到任何文档(包括' man bash',似乎它不是"子串扩展" ;其格式为{parameter:offset:length}
),用于解释语法。
有人可以向我解释或指出这个功能的文件吗?
答案 0 :(得分:1)
这称为参数扩展。在这种情况下,它会将所有:
替换为/bin:
${MYPATH//://bin:}
^^^^^^ ^
| ^^| ^^^^^
| | | replacement
| | match string
var match all
太多的斜线都会产生误导。见更好的例子:
MYPATH="hello1hello2"
$ echo ${MYPATH//hello/bye}
bye1bye2
或:
d="a:b:c"
$ echo ${d//://bin:}
a/bin:b/bin:c
如果我们只使用一个斜杠,请注意区别:
$ echo ${MYPATH/hello/bye}
bye1hello2
答案 1 :(得分:1)
这是substring expansion形式的一个令人困惑但有效的实现:
${parameter//pattern/string}
加倍的正斜杠将用 string 替换 pattern 的所有副本,而不仅仅是第一个匹配。在您的示例中:
echo ${MYPATH//://bin:}/bin
扩张说:
:
的所有副本。/bin:
。/bin
,因为它在参数扩展之外。