Przypisanie warunkowe na podstawie zmiennej środowiskowej

11

W skrypcie bash przypisuję zmienną lokalną, aby wartość zależała od zewnętrznej, globalnej zmiennej środowiskowej ( $MYAPP_ENV).

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

Czy istnieje krótszy (ale czysty) sposób na napisanie powyższego zadania? (Prawdopodobnie używa pewnego rodzaju operatora warunkowego / inline if.)

Jonik
źródło

Odpowiedzi:

17

Możesz również użyć skrzynki / przełącznika, bashaby to zrobić:

case "$MYAPP_ENV" in
 PROD) SERVER_LOGIN="[email protected]" ;;
    *) SERVER_LOGIN="[email protected]" ;;
esac

Lub ta metoda:

[ "$MYAPP_ENV" = PROD ] &&
   SERVER_LOGIN=foobar123@prod.example.com ||
   SERVER_LOGIN=foobar987@test.example.com
slm
źródło
2
Instrukcja case jest o wiele bardziej czytelna niż zacinanie jej w jednym wierszu (co może zakończyć się katastrofą, jeśli drugie polecenie może zawieść, w tym przypadku jest w porządku, ale wejście w ten nawyk może być kosztowne). Jest to najlepsza metoda w przypadku takich przypadków.
Chris Down,
@Jonik - zaakceptuj jedną z odpowiedzi, jeśli spełnia ona Twoje potrzeby, aby inni wiedzieli, że problem został rozwiązany. Dzięki.
slm
Wydaje mi się, że opis przypadku jest najczystszą z przedstawionych opcji, nawet jeśli nie jest to dokładnie to, czego szukałem. No cóż, składnia Basha jest niezręczna, nie można tego obejść. :)
Jonik
1
@Jonik - to również moje odkrycie. Uwierz mi, szukałem alternatyw, wolę szerokie linie, które robią dużo niż długie programy, a jeśli / to / else jest bardzo gadatliwy dla moich gustów.
slm
9

Próbować:

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

Jeśli twoje przypisanie jest liczbowe, możesz użyć bashoperacji trójskładnikowej:

(( assign_condition ? value_when_true : value_when_false ))
Cuonglm
źródło
1
Ten pierwszy nie jest trójskładnikowy. true && false || echo "if this was ternary, this wouldn't be executed"
Chris Down,
@chris - prawda, ale wciąż jest to dobra praktyczna odpowiedź, nawet jeśli terminologia nie jest do końca właściwa.
cas
@CraigSanders Terminologia ma znaczenie - zbyt często widzę to używane w skryptach, gdy drugie polecenie może zawieść.
Chris Down,
@ChrisDown: Dokonaj edycji odpowiedzi, czy jest teraz lepiej?
cuonglm
1
Lol przez 2,5 roku potrzebowałem na edycję cuonglm!
iruvar
4

Możesz użyć operatorów &&i||

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
MBR
źródło