Assegnazione condizionale basata sulla variabile d'ambiente


11

In uno script bash, sto assegnando una variabile locale in modo che il valore dipenda da una variabile di ambiente globale esterna ( $MYAPP_ENV).

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

C'è un modo più breve (ma pulito) per scrivere il compito sopra? (Presumibilmente usando un qualche tipo di operatore condizionale / in linea se.)

Risposte:


17

Puoi anche usare un caso / interruttore bashper fare questo:

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

O questo metodo:

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

2
Un'istruzione case è molto più leggibile che inceppare tutto in una riga (che può finire in catastrofe se il secondo comando può fallire, in questo caso, va bene, ma entrare in quell'abitudine può essere costoso). Questo è il metodo migliore per affrontare casi come questo.
Chris Down,

@Jonik: accetta una delle risposte se soddisfa le tue esigenze in modo che gli altri sappiano che il problema è stato risolto. Grazie.
slm

Immagino che l'istruzione case sia la più pulita delle opzioni presentate, anche se non è esattamente quello che stavo cercando. Vabbè, la sintassi di Bash è imbarazzante, non posso aggirarla. :)
Jonik,

1
@Jonik - è stata anche questa la mia scoperta. Credimi, ho cercato alternative, preferisco linee ampie che fanno molto piuttosto che programmi lunghi, e if / then / else è molto prolisso anche per i miei gusti.
slm

9

Provare:

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

Se il tuo incarico è numerico, puoi usare l' bashoperazione ternaria:

(( assign_condition ? value_when_true : value_when_false ))

1
Il primo non è ternario. true && false || echo "if this was ternary, this wouldn't be executed"
Chris Down,

@chris - vero, ma è comunque una buona risposta pratica anche se la terminologia non è corretta.
Cas

@CraigSanders La terminologia è importante: lo vedo usato troppo spesso negli script quando il secondo comando può fallire.
Chris Down,

@ChrisDown: apporta le modifiche alla risposta, ora è meglio?
cuonglm

1
Lol per i 2,5 anni occorsi per la modifica di cuonglm!
Iruvar,

4

È possibile utilizzare gli operatori &&e||

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.