環境変数に基づく条件付き割り当て


11

bashスクリプトでは、値が外部のグローバル環境変数($MYAPP_ENV)に依存するように、ローカル変数を割り当てています。

if [ "$MYAPP_ENV" == "PROD" ]
then
    SERVER_LOGIN=foobar123@prod.example.com
else
    SERVER_LOGIN=foobar987@test.example.com
fi

上記の割り当てを書くためのより短い(まだクリーンな)方法はありますか?(おそらく何らかの条件演算子/インラインを使用している場合)

回答:


17

bashこれを行うには、ケース/スイッチを使用することもできます。

case "$MYAPP_ENV" in
 PROD) SERVER_LOGIN="foobar123@prod.example.com" ;;
    *) SERVER_LOGIN="foobar987@test.example.com" ;;
esac

またはこの方法:

[ "$MYAPP_ENV" = PROD ] &&
   SERVER_LOGIN=foobar123@prod.example.com ||
   SERVER_LOGIN=foobar987@test.example.com

2
caseステートメントは、すべてを1行に詰め込むよりもはるかに読みやすくなっています(2番目のコマンドが失敗する可能性がある場合、大惨事で終わる可能性があります。これは、このようなケースを処理する場合に最適な方法です。
Chris Down

@ジョニック-あなたの問題が解決されたことを他の人に知らせるために、それがあなたのニーズを満たしている場合は、回答の1つを受け入れてください。ありがとう。
slm

caseステートメントは、私が探していたものと完全に一致していなくても、提示されたオプションの中で最もクリーンだと思います。まあ、Bashの構文は扱いにくいので、回避できません。:)
Jonik 2013年

1
@ジョニック-それも私の発見でした。私が代替案を探したと信じて、長いプログラムよりも多くのことをする幅広い行を好みます、そしてif / then / elseは私の好みにとっても非常に冗長です。
slm

9

試してください:

[ condition ] && var=value_when_true || var=value_when_false

割り当てが数値の場合、bash3項演算を使用できます。

(( assign_condition ? value_when_true : value_when_false ))

1
前者は三項ではありません。true && false || echo "if this was ternary, this wouldn't be executed"
Chris Down

@chris-本当ですが、用語が正しくない場合でも、それはまだ実用的な答えです。
cas

@CraigSanders用語が重要です-2番目のコマンドが失敗する可能性がある場合、スクリプトでこれが頻繁に使用されることがわかります。
Chris Down

@ChrisDown:答えを編集してください。今のほうがいいですか?
cuonglm 2016

1
lolongは、それがcuonglmの編集にかかった2.5年です!
iruvar 2016

4

&&and ||演算子を使用できます

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.