Designação condicional com base na variável de ambiente


11

Em um script bash, estou atribuindo uma variável local para que o valor dependa de uma variável de ambiente global externa ( $MYAPP_ENV).

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

Existe uma maneira mais curta (mas limpa) de escrever a tarefa acima? (Presumivelmente, usando algum tipo de operador condicional / inline, se.)

Respostas:


17

Você também pode usar um case / switch bashpara fazer isso:

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

Ou este método:

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

2
Uma declaração de caso é muito mais legível do que juntar tudo em uma linha (que pode terminar em catástrofe se o segundo comando falhar; nesse caso, está tudo bem, mas entrar nesse hábito pode ser caro). Este é o melhor método para lidar com casos como este.
21713 Chris Down

@ Jonik - aceite uma das respostas se ela atender às suas necessidades, para que outras pessoas saibam que seu problema foi resolvido. Obrigado.
slm

Acho que a declaração do caso é a mais limpa das opções apresentadas, mesmo que não seja exatamente o que eu estava procurando. Bem, a sintaxe do Bash é estranha, não pode contornar isso. :)
Jonik

1
@ Jonik - essa tem sido a minha descoberta também. Acredite, procurei alternativas, prefiro linhas amplas que fazem muito do que programas longos, e o if / then / else também é muito detalhado para os meus gostos.
slm

9

Experimentar:

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

Se sua atribuição for numérica, você poderá usar a bashoperação ternária:

(( assign_condition ? value_when_true : value_when_false ))

1
O primeiro não é ternário. true && false || echo "if this was ternary, this wouldn't be executed"
Chris Baixo

@ Chris - é verdade, mas ainda é uma boa resposta prática, mesmo que a terminologia não esteja correta.
cas

@CraigSanders A terminologia é importante - eu vejo isso frequentemente usado em scripts quando o segundo comando pode falhar.
Chris Baixo

@ ChrisDown: Faça a edição da resposta, está melhor agora?
cuonglm

1
Lol pelos 2,5 anos que levou para a edição do cuonglm!
Iruvar

4

Você pode usar os operadores &&e||

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.