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

10-08 09:43
查看更多