Интерполировать строку с помощью ссылок на переменные окружения bash. - PullRequest
3 голосов
/ 06 июля 2019

У меня есть строка ввода для моего инструмента Golang CLI с некоторыми ссылками на переменные среды в синтаксисе bash ($VAR и ${VAR}), например ::

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

Каков наиболее эффективный способ интерполировать эту строку, заменяя ссылки на переменные environemnt фактическими значениями? Для предыдущего примера это может быть:

/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
}

но этот код не обрабатывает ${} переменных.

1 Ответ

6 голосов
/ 06 июля 2019

Использование 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] })

Запустите его на детской площадке .

...