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
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 impliquercase
. - Là ' Il ny a pas de
case
impliqué ici. - Non, mais vous avez utilisé littéral
+
, vous aurez donc besoin ducase
à lextérieur pour gérer la soustraction séparément. - @manatwork: Vous voyez n éliminer le
case
du code OP ' avececho $(($num1$op$num2))
– cela fonctionnera , mais utilisercase
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 debc
est quil prend en charge la précision arbitraire tandis que larithmétique shell est limitée au processeur ' sdouble
type. Notez que vous navez ' pas besoin de définirscale
ici. Pour les ajouts, le paramètrescale
nest pas utilisé. Léchelle de3.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, nicomputedval=$(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 $
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