特定の変数のみをenvsubstで置き換える


53

を通じて環境変数の置換を実行しようとしていますenvsubstが、特定の変数のみを置換したいです。

ドキュメントから、envsubst特定の変数のみを置き換えるように伝えることができるはずですが、それを行うことができません。

たとえば、次を含むファイルがある場合:

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

envsubstへの参照のみを置き換えるように実行するにはどうすればよい${VAR_1}ですか?

回答:



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
Sam Liddicott

または、それらのリストがあるSUBST_VARS場合:envsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Sam Liddicott
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.