シェルの変数の変数を解析します。

シェルの変数の変数を解析します。

bashシェルで環境変数を使用し、次のことを行う必要があります。

  • echo $ENVDEVスタックに従ってまたはで解決されます。STAGEPRD
  • echo $DEV_ACCOUNT数字で解析しますecho $DEV_ACCOUNT12345678

echo $ENV_ACCOUNTで確認する必要があるコマンドに使用する必要がありますが、代わり12345678に確認されます。DEV_ACCOUNT12345678

私が使用するコマンドは次のとおりです。

aws events put-targets --rule {{ stack_name | lower }}-hello-world \
    --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:$ENV_ACCOUNT:function:hello-world"

代わりに$ENV_ACCOUNT解決されています。予想される出力は次のとおりです。DEV_ACCOUNT12345678

aws events put-targets --rule {{ stack_name | lower }}-hello-world \
    --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:12345678:function:hello-world"

私は何が間違っていましたか?

答え1

大文字の変数名は一般的には安全ではありません。 $ENV例えば、多くの殻で特別です。これらのシェルでは、その値は特定の種類のシェルを開始する前にインポートするファイルのパス名でなければなりません。シェルはPOSIXモードで使用されますbash$ENV

したがってbash

declare -A account
account["develop"]=12345678
account["staging"]=9128312
account["production"]=123123

mode=$run_mode

aws events put-targets \
    --rule {{ stack_name | lower }}-hello-world \
    --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:${account[$mode]}:function:hello-wolrd"

accountこれにより、開発、準備、および生産モードに関するデータを保持する連想配列が設定されます。次に、使用中のパターンを定義し、配列の正しいデータでコマンドを実行しますaccount。変数は、文字列またはいずれかを含む環境変数と見なされrun_modeますdevelopstagingproduction

連想配列はbash4.0で導入されました。

aws私はあなたが書いたコマンドを使用しました(改行とaccount変数の追加を除く)。それはあなたが期待どおりに動作しないかもしれませんが(コマンドで実行しよう{{ stack_name | lower }}-hello-worldとします)。lowerわからないawsので、どう見えるかはわかりませんが、参考にすればいいようです。


アドレス指定mosvyユーザーの意見に関する懸念:変数DEV_ACCOUNTなどが環境変数の場合は、その内容に応じて正しい変数を選択する必要がありますENV

declare -A account
account["DEV"]=$DEV_ACCOUNT
account["STAGE"]=$STAGE_ACCOUNT
account["PRD"]=$PRD_ACCOUNT

mode=$ENV

# the rest as before

答え2

私は良い先生を繰り返します説明するシェルスクリプトですべての変数名を大文字として使用しないことについて。これは一般的に悪い考えであり、変数名がデフォルトの環境変数と競合すると問題を引き起こす可能性があります。私はまた、彼が答えで説明したように、最善の方法は連想配列を使用することに同意します。

とにかく、配列を使用する代わりにこの(間違った)方法に固執する場合は、次のことを行う必要があります。

varname="$env"_account
aws events put-targets --rule {{ stack_name | lower }}-hello-world \
    --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:${!varname}:function:hello-world"

この${!var}構文は、名前付き変数の値に展開されますvar。たとえば、

$ foo="foovar"
$ bar=foo
$ echo ${!bar}
foovar

しかし、真剣に、そうしないでください。複雑で面倒で読みにくくメンテナンスが難しい連想配列はこれらすべての問題を解決します。

答え3

私の問題に対する解決策を投稿したすべての人に感謝します。私の問題を解決するためにbash配列を実装しました。しかし、友人は簡単な解決策を提案しました。

printenv `echo $ENV`_ACCOUNT

私の問題を解決しました。

関連情報