このトピックが古いことは知っていますが、変数をエクスポートしない、より単純な作業ソリューションがあります。ワンライナーにすることもできますが、\
を使用して分割することを好みます
var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"
# ^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
# define which to replace input output
変数は envsubst
と同じ行に定義する必要があります は環境変数と見なされます。
'$var1,$var3'
指定されたものだけを置き換えるオプションです。 ${VARIABLE_USED_BY_JENKINS}
を含む入力ファイルを想像してください
回答 2 に関して、envsubst について話し合うときに、あなたは次のように尋ねました:
<ブロック引用>.sh スクリプトで宣言されている変数を使用するにはどうすればよいですか?
答えは、 envsubst
を呼び出す前に変数をエクスポートするだけです。 .
envsubst
を使用して、入力で置換する変数文字列を制限することもできます SHELL_FORMAT
引数 (入力内の文字列が一般的なシェル変数値 (例:$HOME
) に意図せず置換されるのを回避します ).
例:
export VAR1='somevalue' VAR2='someothervalue'
MYVARS='$VAR1:$VAR2'
envsubst "$MYVARS" <source.txt >destination.txt
$VAR1
のすべてのインスタンスを置き換えます および $VAR2
(そして VAR1
のみ と VAR2
) source.txt
で 'somevalue'
で と 'someothervalue'
調べてみると、私のシステムには envsubst
があることがわかりました gettext-base パッケージの一部であるコマンド。
したがって、これにより簡単になります:
envsubst < "source.txt" > "destination.txt"
両方に同じファイルを使用する場合は、moreutil の sponge
のようなものを使用する必要があります。 、Johnny Utahh の提案:envsubst < "source.txt" | sponge "source.txt"
. (そうしないと、シェルのリダイレクトによってファイルが読み取られる前に空になるためです。)