Условное присвоение на основе переменной среды

11

В скрипте bash я назначаю локальную переменную так, чтобы ее значение зависело от внешней глобальной переменной среды ( $MYAPP_ENV).

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

Есть ли более короткий (но чистый) способ написать вышеупомянутое задание? (Предположительно, используя какой-то условный оператор / встроенный, если.)

Jonik
источник

Ответы:

17

Вы также можете использовать case / switch 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
SLM
источник
2
Оператор case гораздо удобнее для чтения, чем засовывание всего в одну строку (что может привести к катастрофе, если вторая команда может потерпеть неудачу, в этом случае это нормально, но использование этой привычки может быть дорогостоящим). Это лучший метод при рассмотрении подобных случаев.
Крис Даун
@Jonik - примите один из ответов, если он соответствует вашим потребностям, чтобы другие знали, что ваша проблема решена. Спасибо.
Slm
Я предполагаю, что утверждение case является самым чистым из представленных вариантов, даже если это не совсем то, что я искал. О, хорошо, синтаксис Bash неудобен, не может обойтись. :)
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 ))
cuonglm
источник
1
Бывший не троичный. true && false || echo "if this was ternary, this wouldn't be executed"
Крис Даун
@ Крис - правда, но это все еще хороший практический ответ, даже если терминология не совсем верна.
КАС
@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
MBR
источник