Как заменить переменную bash, соединенную со строкой? - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь создать файл myenv со следующим содержимым SENDER_PASSWORD='my secret password'

BUILD_ENV=STAGING
STAGING_SENDER_PASSWORD="my secret password"

cat > myenv <<- EOL
SENDER_PASSWORD='${${BUILD_ENV}_SENDER_PASSWORD}'
EOL

bash: SENDER_PASSWORD='${${BUILD_ENV}_SENDER_PASSWORD}'
: bad substitution

Есть ли способ добиться этого с помощью одной команды?В основном я пытаюсь получить доступ к переменной env STAGING_SENDER_PASSWORD и поместить ее в файл myenv

1 Ответ

1 голос
/ 03 июня 2019

Есть ли способ достичь этого с помощью одной команды?

eval ваш враг:

SENDER_PASSWORD=$(eval echo \${${BUILD_ENV}_SENDER_PASSWORD})
// or better, with quoting
SENDER_PASSWORD=$(eval echo "\"\${${BUILD_ENV}_SENDER_PASSWORD}\"")

Использование расширения косвенной переменной bash способ безопаснее, но это будет два выражения:

SENDER_PASSWORD=$(tmp=${BUILD_ENV}_SENDER_PASSWORD; printf "%s" "${!tmp}")

Если посмотреть на цель вашего дизайна, я бы обернул ее в функцию (давайте это сделаем!):

get_var() {
    local tmp
    tmp=${BUILD_ENV}_$1
    # ex. add if [ -z "${!tmp}" ]; then use some default value
    printf "%s\n" "${!tmp}"
}

SENDER_PASSWORD=$(get_var SENDER_PASSWORD) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...