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.)

Odpowiedzi:


17

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

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

Lub ta metoda:

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

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 ))

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.