我有一个我的golang cli工具的输入字符串,其中一些引用了bash语法中的环境变量( $VAR
和 ${VAR}
(,例如:
$HOME/somedir/${SOME_VARIABLE}dir/anotherdir-${ANOTHER_VARIABLE}
通过用实际值替换环境变量引用来插值此字符串的最有效方法是什么?对于上一个示例,可以是:
/home/user/somedir/4dir/anotherdir-5
如果HOME=/home/user
,SOME_VARIABLE=4
和ANOTHER_VARIABLE=5
。
现在我正在使用:
func interpolate(str string) string {
for _, e := range os.Environ() {
parts := strings.SplitN(e, "=", 2)
name, value := parts[0], parts[1]
str = strings.Replace(str, "$" + name, value, -1)
}
return str
}
但是此代码无法处理${}
变量。
使用OS.Expandenv:
s := os.ExpandEnv(
"$HOME/somedir/${SOME_VARIABLE}dir/anotherdir-${ANOTHER_VARIABLE}")
您可以使用OS.Expand作为未从环境变量获取值的情况:
m := map[string]string{
"HOME": "/home/user",
"SOME_VARIABLE": "4",
"ANOTHER_VARIABLE": "5",
}
s := os.Expand(
"$HOME/somedir/${SOME_VARIABLE}dir/anotherdir-${ANOTHER_VARIABLE}",
func(s string) string { return m[s] })
在操场上运行。