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

Interpolate a string with bash-like environment variables references

我的 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
}

但此代码不处理 ${} 变量。

使用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.