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

Jonik
fonte

Respostas:

17

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

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

Ou este método:

[ "$MYAPP_ENV" = PROD ] &&
   SERVER_LOGIN=foobar123@prod.example.com ||
   SERVER_LOGIN=foobar987@test.example.com
slm
fonte
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 ))
cuonglm
fonte
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
MBR
fonte