web-dev-qa-db-fra.com

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

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").

106
Michael Durrant

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.

148
goldilocks

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.

15
evilsoup
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 `.

5
Himani

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
3
jedi

minimaliste

total=0
((total+=qty))
2
geekzspot

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
$
0
Wildcard