Bedingte Zuordnung basierend auf Umgebungsvariablen


10

In einem Bash-Skript weise ich eine lokale Variable zu, sodass der Wert von einer externen, globalen Umgebungsvariablen abhängt ( $MYAPP_ENV).

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

Gibt es eine kürzere (und dennoch saubere) Möglichkeit, die obige Aufgabe zu schreiben? (Vermutlich mit einem bedingten Operator / Inline, wenn.)

Antworten:


16

Sie können dazu auch einen Fall / Schalter bashverwenden:

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

Oder diese Methode:

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

2
Eine case-Anweisung ist weitaus besser lesbar, als alles in einer Zeile zusammenzufassen (was zu einer Katastrophe führen kann, wenn der zweite Befehl fehlschlägt. In diesem Fall ist dies in Ordnung, aber es kann kostspielig sein, sich an diese Gewohnheit zu gewöhnen). Dies ist die beste Methode, wenn Sie sich mit solchen Fällen befassen.
Chris Down

@ Jonik - Bitte akzeptieren Sie eine der Antworten, wenn sie Ihren Anforderungen entspricht, damit andere wissen, dass Ihr Problem behoben wurde. Vielen Dank.
slm

Ich denke, die case-Anweisung ist die sauberste der angebotenen Optionen, auch wenn sie nicht genau das ist, wonach ich gesucht habe. Na ja, die Bash-Syntax ist umständlich, ich kann das nicht umgehen. :)
Jonik

1
@ Jonik - das war auch meine Erkenntnis. Glauben Sie mir, ich habe nach Alternativen gesucht, ich bevorzuge breite Linien, die viel tun, anstatt lange Programme, und das Wenn / Dann / Sonst ist auch für meinen Geschmack sehr ausführlich.
slm

8

Versuchen:

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

Wenn Ihre Zuordnung numerisch ist, können Sie die bashternäre Operation verwenden:

(( assign_condition ? value_when_true : value_when_false ))

1
Ersteres ist nicht ternär. true && false || echo "if this was ternary, this wouldn't be executed"
Chris Down

@chris - stimmt, aber es ist immer noch eine gute praktische Antwort, auch wenn die Terminologie nicht ganz richtig ist.
Cas

@CraigSanders Die Terminologie ist wichtig - ich sehe dies viel zu oft in Skripten, wenn der zweite Befehl fehlschlagen kann.
Chris Down

@ChrisDown: Bearbeiten Sie die Antwort. Ist es jetzt besser?
Cuonglm

1
Lol für die 2,5 Jahre, die es für die Bearbeitung von cuonglm gedauert hat!
iruvar

4

Sie können die Operatoren &&und verwenden||

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.