comment puis-je ajouter (soustraire, etc.) deux nombres avec bash?

Je peux lire les nombres et le fonctionnement avec:

echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op 

mais alors tout mes tentatives pour ajouter les nombres échouent:

case "$op" in "+") echo num1+num2;; "-") echo `num1-num2`;; esac 

Exécuter:

First number please 1 Second mumber please 2 Operation? + 

Résultat:

num1+num2 

… ou …

echo $num1+$num2;; # results in: 1+2 

… ou. ..

echo `$num1`+`$num2`;; # results in: ...line 9: 1: command not found 

On dirait que jobtiens encore des chaînes peut-être quand jessaie dajouter add (« 2 + 2 » au lieu de « 4 »).

Commentaires

  • Jai édité votre titre car cest une bonne question générale, et si vous aviez réduit le contexte, vous auriez réalisé que cela na rien à voir avec case ou autre chose sauf une ligne: echo $num+$num, puisque reproduira exactement le problème . Lidée avec minimisation le contexte des questions de programmation est expliqué ici: sscce.org
  • +1 Salut goldilocks, oui cela mest apparu clair après, mais oui je totall Vous êtes daccord avec votre raisonnement et oui, plus une question est ' singulière ' précise et mieux vaut. Je souhaite la bienvenue à vos modifications 🙂 Merci 🙂

Réponse

Larithmétique dans les shells POSIX se fait avec $ et les doubles parenthèses (( )):

echo "$(($num1+$num2))" 

Vous pouvez attribuer à partir de cela (sans echo):

num1="$(($num1+$num2))" 

Il y a aussi expr:

expr $num1 + $num2 

Dans les scripts $(()) est préférable car il évite un fork / execute pour la commande expr.

Commentaires

  • Ou même directement echo $(($num1$op$num2)) sans impliquer case.
  • Là ' Il ny a pas de case impliqué ici.
  • Non, mais vous avez utilisé littéral +, vous aurez donc besoin du case à lextérieur pour gérer la soustraction séparément.
  • @manatwork: Vous voyez n éliminer le case du code OP ' avec echo $(($num1$op$num2)) – cela fonctionnera , mais utiliser case est plus robuste car vous pouvez gérer les erreurs avec un * par défaut.
  • +1 à vous deux. Jutilisais le cas (je ne lai peut-être pas montré au début) mais comme vous avez tous les deux réalisé que le problème nétait pas ' à propos du cas.

Réponse

La réponse existante est pure bash, donc ce sera plus rapide que cela, mais elle ne peut gérer que des entiers. Si vous avez besoin de gérer des flottants, vous devez utiliser le programme externe bc.

$ echo "scale=4;3.1415+9.99" | bc 13.1315 

Le scale=4 indique à bc dutiliser quatre décimales. Voir man bc pour plus dinformations.

Commentaires

  • Notez que tandis que bash ne ' t prend en charge larithmétique en virgule flottante avec $((...)), de nombreux shells (ksh93, zsh, yash au moins) faire. Lavantage de bc est quil prend en charge la précision arbitraire tandis que larithmétique shell est limitée au processeur ' s double type. Notez que vous navez ' pas besoin de définir scale ici. Pour les ajouts, le paramètre scale nest pas utilisé. Léchelle de 3.1415+9.99 sera dérivée de celle des opérandes (ici 4).
  • Comment faire le calcul si une valeur est 450 et lautre est en décimal stocké sur une variable $mynumber? Par exemple, 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc devrait le faire. Si vous voulez quune variable se développe, vous devez utiliser des guillemets doubles plutôt que des guillemets simples.
  • @evilsoup, maintenant cela fonctionne comme un charme. Merci.
  • computedval=$(echo 'scale=10;var1-var2' | bc) ne ' ne fonctionne pas, ni computedval=$(echo 'scale=10;$var1-$var2' | bc)

Réponse

Vous pouvez également utiliser la structure $[ ... ]. Dans ce cas, nous utilisons un mécanisme intégré dans Bash, qui est plus rapide et un peu plus pratique à utiliser. Puisque nous savons que tout entre $ [, et] est traité comme une expression, nous navons pas besoin de faire précéder les variables de $. De même, nous navons pas besoin de sécuriser * de le traiter comme un motif.

num1=2 num2=3 echo $[num1 + num2] 5 

Réponse

echo `expr $a + $b` echo `expr $a - $b` echo `expr $a \* $b` echo `expr $a / $b` 

Notez le \ avant le * (pour la multiplication), toute lexpression doit être entre les guillemets `.

Commentaires

  • expr nest pas nécessaire, et ' nest jamais nécessaire pour capturer la sortie standard dune commande juste pour la réécrire dans la sortie standard.

Réponse

minimaliste

total=0 ((total+=qty)) 

Réponse

Basé sur la séquence dentrées que vous demandez à lutilisateur , il semble que vous utilisez la notation polonaise inversée.

echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op 

Vous pouvez faire mieux dutiliser simplement dc (calculatrice de bureau) directement, car cest à cela quil sert.

DESCRIPTION Dc is a reverse-polish desk calculator which supports unlimited pre- cision arithmetic. 

E xample session avec dc:

$ dc 1 2 + p # This part is typed; the result comes next. 3 q # This is also typed. $ 

Ou, de manière non interactive:

$ dc -e "1 2 + p" 3 $ 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *