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

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

ファイル内の環境変数を置き換え/評価する簡単な方法はありますか?

以下を含むファイルがあるとしますconfig.xml

<property>
    <name>instanceId</name>
    <value>$INSTANCE_ID</value>
</property>
<property>
    <name>rootPath</name>
    <value>/services/$SERVICE_NAME</value>
</property>

...など。

$INSTANCE_IDファイルのenv var値を環境変数の値に置き換えたいと思います。INSTANCE_ID$SERVICE_NAMESERVICE_NAME

どの環境変数が必要かを事前に知りません(または、誰かが設定ファイルに新しい環境変数を追加した場合は、スクリプトを更新したくありません)。

答え1

使用できるenvsubst(部分gnu gettext):

envsubst < infile

ファイルの環境変数はその値に置き換えられます。変数名は英数字またはアンダースコアASCII文字でのみ構成する必要があり、数字で始めることはできず、空白にすることはできません。それ以外の場合、対応する変数参照は無視されます。

gettext envsubstこのサポートとアドオンの${VAR:-default}いくつかの代替案:
rust選ぶ
go選ぶ
node.js選ぶ


特定の環境変数のみを交換し、この質問を見ました。

答え2

良くないけど動作します

( echo "cat <<EOF" ; cat config.xml ; echo EOF ) | sh

シェルスクリプトにある場合は、次のようになります。

#! /bin/sh
cat <<EOF
<property>
    <name>instanceId</name>
    <value>$INSTANCE_ID</value>
</property>
EOF

編集、2番目の提案:

eval "echo \"$(cat config.xml)\""

質問と厳密には関係ありませんが、ファイルから変数を読む場合は編集してください。

(. .env && eval "echo \"$(cat config.xml)\"")

答え3

Perlがある場合(gettextとgettextではないenvsubst)、単純な置換のために短いスクリプトを使用できます。

$ export INSTANCE_ID=foo; export SERVICE_NAME=bar;
$ perl -pe 's/\$([_A-Z]+)/$ENV{$1}/g'  < config.xml
<property>
    <name>instanceId</name>
    <value>foo</value>
</property>
<property>
    <name>rootPath</name>
    <value>/services/bar</value>
</property>

変数名には大文字と下線のみがあると仮定しますが、最初のパターンは必要に応じて簡単に変更できます。 $ENV{...}Perlが見る環境への参照です。

構文をサポートしたり、設定されていない変数にエラーを発生させるには、${...}追加の作業が必要です。gettext'に対応するおおよその内容は次のとおりですenvsubst

perl -pe 's/\$(\{)?([a-zA-Z_]\w*)(?(1)\})/$ENV{$2}/g'

プロセス環境を介してこれらの変数を提供することは一般的に少し不確実に見えます。ファイル内の任意の変数を使用することはできず(特別な意味を持つ可能性があるため)、一部の値には少なくともわずかに機密性の高いデータが含まれる場合があります。それらを。

答え4

PerlとPHPの例を続けて、Python onelinerは次のようになります。

python -c 'import os,sys; sys.stdout.write(os.path.expandvars(sys.stdin.read()))' < in.file > out.file

残念ながら、すべての環境にenvsubstこのプログラムがインストールされているわけではありません。

関連情報