GNU/Linux >> Linux の 問題 >  >> Linux

テキスト内の環境変数が存在する場合は置き換えます

env を使用できます 現在定義されているすべての環境変数を表示し、そのリストを使用してそれらのみを置き換えます。 (man ページはそれについてあまり明確ではありませんが、説明についてはこの回答を参照してください。)

echo 'Hello $USER $UNKNOWN' | envsubst "$(env | cut -d= -f1 | sed -e 's/^/$/')"

( env の出力 変数の値もリストしますが、 envsubst 先頭の $ も見たい 、だから cut -d= -f1 だけを使うことはできません 残念ながら、それ自体で。単一の sed を使用できます cut をする の仕事でもあります。以前のリビジョンを参照してください。ただし、cut の明快さが好みです わずかなパフォーマンスの向上よりも。)


$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


Linux
  1. ファイル内の環境変数を実際の値に置き換えますか?

  2. * in * / etc / environment?で環境変数を参照する

  3. envsubst:コマンドが見つかりません

  1. 環境変数の確認

  2. シンボリック リンクの環境変数

  3. 複雑なテキスト ファイルでシェル変数を置き換える方法

  1. プロパティ ファイル内の環境変数の置き換え

  2. 一時的な環境を設定する ($PATH)

  3. Linux 環境変数の設定