用类似bash的环境变量引用插入字符串

时间:2019-07-06 15:27:07

标签: go environment-variables string-interpolation

我的Golang CLI工具有一个输入字符串,其中包含对bash语法($VAR${VAR})中的环境变量的一些引用,例如:

$HOME/somedir/${SOME_VARIABLE}dir/anotherdir-${ANOTHER_VARIABLE}

通过用实际值替换环境变量引用来插值此字符串的最有效方法是什么? 对于前面的示例,它可以是:

/home/user/somedir/4dir/anotherdir-5

如果HOME=/home/userSOME_VARIABLE=4ANOTHER_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
}

但是此代码无法处理${}变量。

1 个答案:

答案 0 :(得分:6)

使用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] })

Run it in the playground