2 votes

Expression Bash pour "x = (x - 1) sauf si (x - 1 == 0) auquel cas y"

Je veux décrémenter une variable 'x', mais si le décrémentation de x donne 0, je veux stocker une valeur sentinelle (disons 'bonjour') dans x à la place.

Je peux le faire avec deux expressions:

x=$((x - 1))
[[ "$x" -eq "0" ]] && x=hello

Y a-t-il une solution élégante en une seule ligne qui fait cela? J'ai expérimenté avec des évaluations mathématiques et des opérateurs ternaires mais

x=1
echo $((x-1 == 0 ? "hello" : x-1))

ne imprime jamais hello, ça imprime juste 0.

3voto

Benjamin W. Points 19035

Vous pourriez utiliser (( )) pour évaluer si son contenu est non nul, et si ce n'est pas le cas, vous pouvez exécuter conditionnellement une commande :

$ x=1
$ (( --x )) || x='hello'
$ echo "$x"
hello

(( )) est évalué à vrai (statut de sortie 0) si l'expression à l'intérieur est non nulle:

  • (( 1 )) est vrai
  • (( 0 )) est faux

(( --x )) est faux si x vaut 1 avant l'évaluation.

Si l'opérateur ternaire fonctionnait avec à la fois des chaînes de caractères et des nombres, cela pourrait également s'écrire comme

(( x = x-1 ? x-1 : 'hello' ))

mais les chaînes de caractères se transforment en 0 dans un contexte arithmétique en Bash.

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