$ {MYPATH //:// bin:} / bin在bash shell中的含义是什么?

时间:2014-11-03 12:22:14

标签: bash shell path

我一直在看一个附加名为' 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}),用于解释语法。

有人可以向我解释或指出这个功能的文件吗?

2 个答案:

答案 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

Parameter expansion#Search and replace中的更多信息。

答案 1 :(得分:1)

子串扩展

这是substring expansion形式的一个令人困惑但有效的实现:

${parameter//pattern/string}

加倍的正斜杠将用 string 替换 pattern 的所有副本,而不仅仅是第一个匹配。在您的示例中:

echo ${MYPATH//://bin:}/bin

扩张说:

  1. 匹配模式:的所有副本。
  2. 将每个匹配项替换为字符串/bin:
  3. 在子字符串扩展的结果中附加文字/bin,因为它在参数扩展之外。