Умовне призначення на основі змінної середовища


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
Опис справи набагато легше читати, ніж заклинювати все це в один рядок (що може закінчитися катастрофою, якщо друга команда може вийти з ладу; в цьому випадку це добре, але потрапляння в цю звичку може бути дорогим). Це найкращий метод при роботі з подібними справами.
Кріс Даун

@Jonik - прийміть одну з відповідей, якщо вона відповідає вашим потребам, щоб інші знали, що вашу проблему вирішено. Дякую.
slm

Я думаю, що випадок справи є найчистішим із представлених варіантів, навіть якщо це не зовсім те, що я шукав. Ну добре, синтаксис Баша незручний, не обійти цього. :)
Jonik

1
@Jonik - це теж було моїм висновком. Повірте, я шукав альтернативи, я віддаю перевагу широким лініям, які роблять багато, а не довгим програмам, і if / then / else є дуже багатослівним і для моїх смаків.
slm

9

Спробуйте:

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

Якщо ваше завдання чисельне, ви можете використовувати bashпотрійну операцію:

(( assign_condition ? value_when_true : value_when_false ))

1
Перший не є потрійним. true && false || echo "if this was ternary, this wouldn't be executed"
Кріс Даун

@chris - правда, але це все-таки хороша практична відповідь, навіть якщо термінологія не зовсім правильна.
cas

@CraigSanders Термінологія має значення - я дуже часто бачу цей використовуваний спосіб у сценаріях, коли друга команда може вийти з ладу.
Кріс Даун

@ChrisDown: Зробіть редагування відповіді, чи краще зараз?
cuonglm

1
Lol за 2,5 роки, які знадобилися для редагування cuonglm!
iruvar

4

Ви можете використовувати оператори &&і||

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.