私のスクリプトに助けが必要です。
次の環境変数があります。
SECRET_OF_AN_APP_dev=123
SECRET_OF_AN_APP_test=456
SECRET_OF_AN_APP_prod=789
変更できるスクリプトが必要です。SECRET_OF_AN_APP_dev=123到着SECRET_OF_AN_APP=123最初の繰り返しでこれをenvにエクスポートしてからSECRET_OF_AN_APP_TEST=456に変更SECRET_OF_AN_APP=4562回目の繰り返しなどで
#!/bin/bash
APP_SECRET=SECRET_OF_AN_APP
ENVIRONMENT_NAME=dev
LIST_OF_ENVIRONMENTS=[dev, prod, test...]
for i in $LIST_OF_ENVIRONMENTS
do
APP_SECRET=$(env | grep APP_SECRET_$i | sed 's/APP_SECRET_'"$i"'=//g' ) >> var.bash
. ./var.bash
./some_script_where_$APP_SECRET_is_required.sh
done
echo $SECRET_OF_AN_APP
私のスクリプトは、次の操作を行うと空であるため、サブシェルのように動作すると思います。
このループ内で実行される他のスクリプトにはこれらの変数が必要なので、これを設定する必要があります。
私はexport
、with ./var.bash
、withset -o allexport
などを試しました。
何も動作しません。
スクリプトだけでなく、シェルに「echo $SECRET_OF_AN_APP」を含める必要があります。スクリプト通りに実行中です。しかし、私の環境変数には設定されていません。
ベストアンサー1
あなたを悩ませる問題の1つは、env | grep APP_SECRET_$i
APP_SECRET値を期待されるSECRET_OF_AN_APP変数名に変更しなかったことです。この問題を解決するには、APP_SECRETに変数拡張を追加してください。
APP_SECRET 割り当ての出力をキャプチャ$(env ...)
し、その割り当ての出力をファイルにリダイレクトしました。コマンド置換の出力は正確でAPP_SECRETに割り当てることができますが、その割り当てテキストは出力ファイルには表示されません。
APP_SECRETをエクスポートするか(このシェルスクリプトに割り当てられているため)、割り当てをファイルに印刷して割り当てをインポートする前に、割り当てリダイレクトをスキップします。
誰でも:
export APP_SECRET
または:
APP_SECRET=$(varname=${APP_SECRET}_${i}; printf '%s' "${!varname}" )
declare -p APP_SECRET >> var.bash
echo "export APP_SECRET" >> var.bash # if you need it to be exported
目的の実際の変数値の名前を保持するために変数を結合するようにコマンド置換を簡素化しました。下線がAPP_SECRET変数の一部と見なされないように、ここでは中括弧を使用します。次に、bashの変数間接拡張を使用して「varname」を変数名に展開し、値を取得します。それ変えるたとえば、「varname」を「SECRET_OF_AN_APP_dev」に変換し、その値(例:123)を見つけます。
このスクリプトが終了した後にシェルがAPP_SECRET値を使用する必要がある場合、親シェルはvar.bashファイルからソースを取得する必要があります。
. ./var.bash
また見なさい: