用类似BASH的环境变量参考插值字符串



我有一个我的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] })

在操场上运行。

最新更新