テキストに環境変数がある場合は置き換えます

テキストに環境変数がある場合は置き換えます

envsubst入力で宣言された環境変数を置き換えることを知っています。

$ echo 'Hello $USER' | envsubst
Hello myusername

envsusbst私が望むのは、環境変数が存在する場合はそれを置き換え、変数文字列はそのままにする方法(または他のコマンド)です。私が得るものは次のとおりです。

$ echo 'Hello $USER $UNDEFINED_VARIABLE' | envsubst
Hello myusername

私が望むもの:

$ echo 'Hello $USER $UNDEFINED_VARIABLE' | somecommand
Hello myusername $UNDEFINED_VARIABLE

ベストアンサー1

$USER$PATH次のパラメータを渡すと、envsubstそのパラメータで参照される変数のみが拡張されます。

したがって、1つのアプローチは、現在定義されているすべての環境変数をその形式で渡すことです。そしてzsh

echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
  envsubst \$${(kj:$:)parameters[(R)*export*]}
  • $parameters変数名をその型にマップする特殊な連想配列。
  • $parameters[(R)*export*]連想配列の値に含まれるすべての要素に展開されますexport
  • kパラメータ拡張フラグを使用してください。戻り値の代わりに
  • j:$:これらの要素をリンクし$、最初に1つを追加します。

他のシェルの場合は、いつでも戻ってperlリストをインポートできます。

echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
  envsubst "$(perl -e 'print "\$$_" for grep /^[_a-zA-Z]\w*$/, keys %ENV')"

環境変数の漏洩に注意してください名前出力からps

代わりに、以下からすべての操作を実行できますperl

perl -pe 's{(?|\$\{([_a-zA-Z]\w*)\}|\$([_a-zA-Z]\w*))}{$ENV{$1}//$&}ge'

同じことがあるので注意してください限定ただenvsubstそうです。それは次のようなものを拡張しません${VAR:-x}シェルが展開されないなどの$HOME項目を展開します。\$HOME$$HOME

おすすめ記事