Asignación condicional basada en variable de entorno

11

En un script bash, estoy asignando una variable local para que el valor dependa de una variable de entorno global externa ( $MYAPP_ENV).

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

¿Hay una forma más corta (pero limpia) de escribir la tarea anterior? (Presumiblemente usando algún tipo de operador condicional / en línea si.)

Jonik
fuente

Respuestas:

17

También puede usar un caso / cambiar bashpara hacer esto:

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

O este método:

[ "$MYAPP_ENV" = PROD ] &&
   SERVER_LOGIN=foobar123@prod.example.com ||
   SERVER_LOGIN=foobar987@test.example.com
slm
fuente
2
Una declaración de caso es mucho más legible que agruparlo todo en una línea (lo que puede terminar en una catástrofe si el segundo comando puede fallar, en este caso, está bien, pero adquirir ese hábito puede ser costoso). Este es el mejor método cuando se trata de casos como este.
Chris Down
@ Jonik: acepte una de las respuestas si satisface sus necesidades para que otros sepan que su problema se ha resuelto. Gracias.
slm
Supongo que la declaración del caso es la más limpia de las opciones presentadas, incluso si no es exactamente lo que estaba buscando. Oh, bueno, la sintaxis de Bash es incómoda, no puedo evitar eso. :)
Jonik
1
@ Jonik: ese también ha sido mi hallazgo. Créame, he buscado alternativas, prefiero líneas anchas que hacen mucho en lugar de programas largos, y el if / then / else también es muy detallado para mis gustos.
slm
9

Tratar:

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

Si su asignación es numérica, puede usar la bashoperación ternaria:

(( assign_condition ? value_when_true : value_when_false ))
Cuonglm
fuente
1
El primero no es ternario. true && false || echo "if this was ternary, this wouldn't be executed"
Chris Down
@chris: cierto, pero sigue siendo una buena respuesta práctica incluso si la terminología no es del todo correcta.
cas
@CraigSanders La terminología importa: veo que esto se usa con demasiada frecuencia en los scripts cuando el segundo comando puede fallar.
Chris Down
@ChrisDown: Edite la respuesta, ¿es mejor ahora?
Cuonglm
1
Jajaja por los 2.5 años que tomó para la edición de cuonglm!
iruvar
4

Puede usar los operadores &&y||

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