Замена только определенных переменных с envsubst


54

Я пытаюсь выполнить замену переменных среды через envsubst, но я хочу заменить только определенные переменные.

Из документов я должен сказать, envsubstчтобы заменить только определенные переменные, но я не могу это сделать.

Например, если у меня есть файл, содержащий:

VAR_1=${VAR_1}
VAR_2=${VAR_2}

как выполнить envsubstтак, чтобы он заменял только ссылку на ${VAR_1}?

Ответы:


4

Перед вызовом envsubstвы должны использовать экспорт, используя одинарные кавычки, чтобы вернуться VAR_1модифицированным. Как в:

export VAR_1='somevalue'

Для более подробной информации, пожалуйста, смотрите:

Как заменить переменные оболочки в сложных текстовых файлах


16
Правильный ответ ниже
Крейг

131

По справочной странице:

envsubst [OPTION] [SHELL-FORMAT]

Если задан SHELL-FORMAT, подставляются только те переменные окружения, на которые есть ссылки в SHELL-FORMAT; в противном случае все ссылки на переменные среды, встречающиеся в стандартном вводе, заменяются.

Где строки SHELL-FORMAT - это «строки со ссылками на переменные оболочки в форме $variableили ${variable}[...] имена переменных должны состоять исключительно из буквенно-цифровых символов или символов подчеркивания ASCII, не начинаться с цифры и быть непустыми; в противном случае такая ссылка на переменную проигнорировано «. ,
Таким образом, необходимо передать соответствующие имена переменных envsubstв строке формата оболочки (очевидно, их нужно экранировать / заключать в кавычки, чтобы передавать их буквально envsubst). Пример:

входной файл, например infile:

VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}

и некоторые значения, такие как

export  VAR1="one" VAR2="two" VAR3="three"

затем работает

envsubst '${VAR1} ${VAR3}' <infile

или же

envsubst '${VAR1},${VAR3}' <infile

или же

envsubst '${VAR1}
${VAR3}' <infile

выходы

VAR1=one
VAR2=${VAR2}
VAR3=three

Или, если вы предпочитаете обратную косую черту:

envsubst \$VAR1,\$VAR2 <infile

производит

VAR1=one
VAR2=two
VAR3=${VAR3}

14
почему это не принятый ответ?
Qsiris

3
Да, это правильный ответ!
Томас Деко

3
Если вы знаете префикс переменной, который нужно использовать для ограничения переменных, которые можно заменить:envsubst "$(printf '${%s} ' ${!PREFIX*})" < infile
Сэм Лиддикотт

Или если у вас есть список из них в SUBST_VARS:envsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Сэм Лиддикотт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.