Affectation conditionnelle basée sur la variable d'environnement


11

Dans un script bash, j'affecte une variable locale afin que la valeur dépende d'une variable d'environnement globale externe ( $MYAPP_ENV).

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

Existe-t-il un moyen plus court (mais propre) d'écrire le devoir ci-dessus? (Probablement en utilisant une sorte d'opérateur conditionnel / en ligne si.)

Réponses:


17

Vous pouvez également utiliser un boîtier / commutateur bashpour ce faire:

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

Ou cette méthode:

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

2
Une déclaration de cas est beaucoup plus lisible que de tout brouiller sur une seule ligne (ce qui peut se terminer en catastrophe si la deuxième commande peut échouer, dans ce cas, c'est bien, mais prendre cette habitude peut être coûteux). C'est la meilleure méthode pour traiter des cas comme celui-ci.
Chris Down

@Jonik - veuillez accepter l'une des réponses si elle répond à vos besoins afin que les autres sachent que votre problème a été résolu. Merci.
slm

Je suppose que l'énoncé de cas est la plus claire des options présentées, même si ce n'est pas exactement ce que je cherchais. Eh bien, la syntaxe Bash est maladroite, je ne peux pas contourner cela. :)
Jonik

1
@Jonik - c'est aussi ma conclusion. Croyez-moi, j'ai cherché des alternatives, je préfère les lignes larges qui font beaucoup plus que les programmes longs, et le if / then / else est très bavard à mon goût aussi.
slm

9

Essayer:

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

Si votre affectation est numérique, vous pouvez utiliser l' bashopération ternaire:

(( assign_condition ? value_when_true : value_when_false ))

1
Le premier n'est pas ternaire. true && false || echo "if this was ternary, this wouldn't be executed"
Chris Down

@chris - vrai, mais c'est toujours une bonne réponse pratique même si la terminologie n'est pas tout à fait correcte.
cas

@CraigSanders La terminologie est importante - je vois cela trop souvent utilisé dans les scripts lorsque la deuxième commande peut échouer.
Chris Down

@ChrisDown: Faites la modification de la réponse, est-ce mieux maintenant?
cuonglm

1
Lol pour les 2,5 ans qu'il a fallu pour le montage de cuonglm!
iruvar

4

Vous pouvez utiliser les opérateurs &&et||

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.