Заміна лише конкретних змінних envsubst


53

Я намагаюся виконувати заміну змінних оточуючих envsubst, але хочу замінити лише певні змінні.

У документах я маю змогу сказати envsubstзамінити лише певні змінні, але я не можу це зробити.

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

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

як я повинен виконати envsubstтак, щоб він заміняв лише посилання на ${VAR_1}?

Відповіді:


4

Перед тим, як зателефонувати, envsubstвам слід скористатися експортом, використовуючи єдині котирування, щоб повернутися до VAR_1модифікації. А саме:

export VAR_1='somevalue'

Для отримання детальної інформації див.

Як замінити змінні оболонки у складних текстових файлах


16
Правильна відповідь нижче
Крейг

130

На сторінці чоловіка:

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}

13
чому це не прийнята відповідь?
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.