Je peux lire les chiffres et le fonctionnement avec:
echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op
mais toutes mes tentatives pour ajouter les chiffres échouent:
case "$op" in
"+")
echo num1+num2;;
"-")
echo `num1-num2`;;
esac
Courir:
First number please
1
Second mumber please
2
Operation?
+
Production:
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 j'obtiens encore des chaînes peut-être quand j'essaye d'ajouter ajouter ("2 + 2" au lieu de "4").
Arithmétique dans les shells POSIX se fait avec $
Et des parenthèses doubles (( ))
:
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 elle évite un fork/execute pour la commande expr
.
La réponse existante est pure bash, elle sera donc plus rapide que cela, mais elle ne peut gérer que des entiers. Si vous devez 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
d'utiliser quatre décimales. Voir man bc
pour plus d'informations.
echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a \* $b`
echo `expr $a / $b`
Noter la \
avant le *
(pour la multiplication), toute l'expression doit se trouver entre les guillemets `.
Vous pouvez aussi utiliser $[ ... ]
structure. Dans ce cas, nous utilisons le mécanisme intégré dans Bash, qui est plus rapide et un peu plus pratique à utiliser. Puisque nous savons que tout ce qui se trouve entre $ [ et] est traité comme une expression, nous n'avons pas besoin de faire précéder les variables de $
. De même, nous n'avons pas besoin de sécuriser *
de le traiter comme un modèle.
num1=2
num2=3
echo $[num1 + num2]
5
minimaliste
total=0
((total+=qty))
Sur la base de la séquence d'entrées que vous demandez à l'utilisateur, il semble que vous utilisez notation polonaise inversée.
echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op
Vous pouvez faire mieux juste d'utiliser dc
(calculatrice de bureau) directement, car c'est à cela qu'il sert.
DESCRIPTION
Dc is a reverse-polish desk calculator which supports unlimited pre-
cision arithmetic.
Exemple de session utilisant 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
$