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

Jonik
la source

Réponses:

17

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

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

Ou cette méthode:

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