591 votes

Opérateur ternaire (?:) en Bash

Y a-t-il un moyen de faire quelque chose comme ça

int a = (b == 5) ? c : d;

en utilisant Bash?

1 votes

La réponse de @dutCh montre que bash possède quelque chose de similaire à l' "opérateur ternaire" cependant en bash cela s'appelle l' "opérateur conditionnel" expr?expr:expr (voir man bash section "Évaluation arithmétique"). Gardez à l'esprit que l' "opérateur conditionnel" de bash est délicat et comporte certains pièges.

0 votes

Bash dispose d'un opérateur ternaire pour les entiers et il fonctionne à l'intérieur de l'expression arithmétique ((...)). Voir Arithmétique de Shell.

1 votes

Tout comme @codeforester l'a mentionné, l'opérateur ternaire fonctionne avec l'expansion arithmétique $(( )) et l'évaluation arithmétique (( )). Voir aussi https://mywiki.wooledge.org/ArithmeticExpression.

633voto

ghostdog74 Points 86060

L'opérateur ternaire ? : est simplement une forme abrégée de if/alors/sinon

case "$b" in
 5) a=$c ;;
 *) a=$d ;;
esac

Ou

 [[ $b = 5 ]] && a="$c" || a="$d"

124 votes

Notez que l'opérateur de = teste l'égalité des chaînes de caractères, pas l'égalité numérique (c'est-à-dire que [[ 05 = 5 ]] est faux). Si vous voulez une comparaison numérique, utilisez -eq à la place.

13 votes

C'est plus une forme abrégée pour if/then/else

17 votes

C'est une façon géniale d'utiliser le comportement de court-circuit pour obtenir un effet d'opérateur ternaire :) :) :)

493voto

Vladimir Points 2510

Code:

a=$([ "$b" == 5 ] && echo "$c" || echo "$d")

73 votes

Ceci est mieux que les autres... le point concernant l'opérateur ternaire est qu'il s'agit d'un opérateur, donc son contexte approprié est une expression, il doit donc renvoyer une valeur.

2 votes

Cela est la façon la plus concise. Soyez conscient que si la partie avec echo "$c" est une commande aliasée et multi-lignes (comme echo 1; echo 2), vous devriez l'encadrer de parenthèses.

2 votes

Cela capturera également toute sortie de la commande testée, aussi (oui, dans ce cas particulier, nous "savons" qu'elle n'en produit pas).

211voto

nemesisfixx Points 2447

Si la condition vérifie simplement si une variable est définie, il existe même une forme plus courte :

a=${VAR:-20}

assignera à a la valeur de VAR si VAR est défini, sinon il lui attribuera la valeur par défaut 20 - cela peut également être le résultat d'une expression.

Cette approche est techniquement appelée "Expansion de paramètre".

8 votes

Dans le cas de passer un paramètre de type chaîne de caractères avec des tirets, j'ai dû utiliser des guillemets : a=${1:-'mon-texte-avec-tirets'}

5 votes

lien pour les paresseux - il existe d'autres opérateurs que simplement substituer (:-)

18 votes

@JustinWrobel - malheureusement pas de syntaxe comme ${VAR:-oui:-non}.

53voto

dutCh Points 91
(( a = b==5 ? c : d )) # chaîne + numérique

38 votes

Ceci est bon pour les comparaisons et les affectations numériques, mais cela donnera des résultats imprévisibles si vous l'utilisez pour les comparaisons et les affectations de chaînes de caractères.... (( )) traite toutes les chaînes de caractères comme 0

5 votes

Cela peut également être écrit : a=$(( b==5 ? c : d ))

43voto

larsmans Points 167484
[ $b == 5 ] && a=$c || a=$d

Mais faites attention avec cette structure, car la partie après le || est également exécutée lorsque la partie entre && et || échoue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X