Je peux lire les chiffres et les opérations avec:
echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op
mais alors toutes mes tentatives pour ajouter les nombres échouent:
case "$op" in
"+")
echo num1+num2;;
"-")
echo `num1-num2`;;
esac
Courir:
First number please
1
Second mumber please
2
Operation?
+
Sortie:
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 je reçois encore des chaînes quand j'essaie d'ajouter add add ("2 + 2" au lieu de "4").
case
ou rien sauf une ligne:,echo $num+$num
puisque cela reproduirait exactement le problème . L'idée de minimiser le contexte dans les questions de programmation est expliquée ici: sscce.orgRéponses:
L'arithmétique dans les shells POSIX est faite avec des
$
doubles parenthèses(( ))
:Vous pouvez assigner à partir de cela (sans
echo
):Il y a aussi
expr
:Dans le script
$(())
est préférable car il évite un fork / execute pour laexpr
commande.la source
echo $(($num1$op$num2))
sans impliquercase
.case
impliqué ici.+
, vous aurez donc besoin de l'case
extérieur pour gérer la soustraction séparément.case
code du code opérateur avececho $(($num1$op$num2))
- cela fonctionnera, mais son utilisationcase
est plus robuste, car vous pouvez gérer les erreurs avec un paramètre par défaut*
.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 avez besoin de manipuler des floats, vous devez utiliser le programme externe
bc
.Le
scale=4
ditbc
d'utiliser quatre décimales. Voirman bc
pour plus d'informations.la source
bash
ne prend pas en charge à virgule flottante avec Arithmétique$((...))
, beaucoup de coquilles (ksh93
,zsh
,yash
au moins) faire. L'avantagebc
est qu'il prend en charge une précision arbitraire alors que l'arithmétique shell est limitée audouble
type de processeur . Notez que vous n'avez pas besoin de définirscale
ici. Pour les ajouts, lescale
paramètre n'est pas utilisé. L'échelle de3.1415+9.99
sera dérivée de celle des opérandes (ici 4).450
et que l'autre est le nombre décimal stocké sur une variable$mynumber
? Par exemple,450-$mynumber
.echo "450-$mynumber" | bc
devrait le faire. Si vous souhaitez développer une variable, vous devez utiliser des guillemets plutôt que des guillemets simples.computedval=$(echo 'scale=10;var1-var2' | bc)
ne fonctionne pas, ni ne fonctionnecomputedval=$(echo 'scale=10;$var1-$var2' | bc)
Notez le
\
avant le*
(pour la multiplication), l'expression entière doit être dans les guillemets arrières `.la source
expr
n'est pas nécessaire et il n'est jamais nécessaire de capturer la sortie standard d'une commande pour la réécrire dans la sortie standard.minimaliste
la source
Vous pouvez également utiliser la
$[ ... ]
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 est entre $ [et] est traité comme une expression, nous n’avons pas besoin de faire précéder les variables$
. De même, nous n'avons pas besoin de nous assurer*
de ne pas le traiter comme un motif.la source
En fonction de la séquence d'entrées que vous demandez à l'utilisateur, il semble que vous utilisiez la notation polonaise inversée.
Vous feriez mieux de simplement utiliser
dc
(calculatrice de bureau) directement, puisque c’est à quoi cela sert.Exemple de session utilisant
dc
:Ou, de manière non interactive:
la source