bash
シェルで環境変数を使用し、次のことを行う必要があります。
echo $ENV
DEV
スタックに従ってまたはで解決されます。STAGE
PRD
echo $DEV_ACCOUNT
数字で解析しますecho $DEV_ACCOUNT
。12345678
echo $ENV_ACCOUNT
で確認する必要があるコマンドに使用する必要がありますが、代わり12345678
に確認されます。DEV_ACCOUNT
12345678
私が使用するコマンドは次のとおりです。
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_ACCOUNT
12345678
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
ますdevelop
。staging
production
連想配列はbash
4.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
私の問題を解決しました。