Ajout de deux nombres à l'aide de expr

13

J'apprends les scripts Shell pour un diplôme en informatique que je fais actuellement. J'essaie d'écrire un petit script qui ajoute deux nombres comme indiqué dans l'un des tutoriels qui nous ont été donnés.

echo "Enter two numbers"
read num1 num2
sum = 'expr $num1 + $num2'
echo "The sum is = $sum"

Cependant, lorsque je lui donne l'autorisation d'exécution et que j'exécute le script, cela me donne cette erreur.

sum: =. No such file or directory.
sum: expr $num1 + $num2: No such file or directory

entrez la description de l'image ici

J'ai essayé de l'exécuter sur Ubuntu et Fedora mais la même erreur se produit. Quelqu'un peut-il me dire ce qui me manque ici?

Isuru
la source

Réponses:

39

Vous devez d'abord vous débarrasser des espaces pour la mission, par exemple

sum='expr $num1 + $num2'

alors vous devez changer 'pour un `ou encore mieux pour $():

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

au lieu d'utiliser, exprvous pouvez également faire le calcul directement dans votre shell:

sum=$((num1 + num2))
Ulrich Dangel
la source
3
Si la motivation pour utiliser exprau lieu de $((...))est un désir d'être portable sur le shell Bourne classique, alors c'est une bonne idée à éviter $(...)également.
Alan Curry
2
@AlanCurry y a-t-il des coquilles qui ne prennent pas en charge $()? Pour autant que je sache, il est requis par posix, par exemple tous les shells compatibles posix devraient prendre en charge$()
Ulrich Dangel
1
@UlrichDangel Le shell Bourne d'origine n'avait pas $(…), mais il est sur le point de disparaître (peut-être que quelqu'un quelque part tourne toujours /bin/shsur Solaris).
Gilles 'SO- arrête d'être méchant'
Le shell C ne prend pas en charge $(…)–– ou du moins, pas toutes les versions.
Scott
Quel est le but d'avoir des guillemets doubles autour des variables?
kojow7
9

Vous avez probablement mal lu les backticks sous forme de guillemets simples dans la ligne:

sum = 'expr $num1 + $num2'

Voir le wiki de Greg sur l'utilisation à la $(...)place.

Cela fonctionne comme prévu:

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

Notez également qu'il n'y a pas d'espace autour du signe égal (l'affectation des variables).

jasonwryan
la source
1

exprest un programme externe utilisé par Bourne shell (ie sh). Le shell Bourne n'avait à l'origine aucun mécanisme pour effectuer une arithmétique simple. Il utilise exprun programme externe à l'aide de backtick.

Le backtick ( ` ) est en fait appelé substitution de commandes. La substitution de commandes est le mécanisme par lequel le shell exécute un ensemble donné de commandes, puis substitue leur sortie à la place des commandes.

sum=`expr $num1 + $num2`

En bash (bourne encore shell) il a le systax suivant, il n'utilisera pas de programme extrnal expr.

sum=$((num1+num2))

si nous voulons utiliser le programme externe expr. nous avons le systax suivant:

sum=$(expr $num1 + $num2)
Premraj
la source
0

Si vous utilisez bash, vous pouvez simplement faire quelque chose comme ceci:

sum=$((num1+num2))
Hopping Bunny
la source
-1
#!/bin/bash
function add()
{
sum=`expr $a + $b`
echo "Sum is :$sum";
}

echo "Enter the value of a";
read a
echo "Enter the valure of b";
read b
add
Imtiyaz
la source
ajoutez également une description du code et comment cela aidera-t-il à résoudre la question?
Tejas
-1

echo "enter first no :"; read a
echo "enter second no :"; read b
echo "sum = `expr $a + $b`"
pandu raju
la source
-2

Vous pouvez utiliser un seul backtick (la `clé)

prashant sahare
la source
1
C'est un backtick, et il est recommandé d'utiliser à la $( ... )place dans les coquilles. De plus, le problème est que OP utilise des espaces là où ils ne devraient pas.
vonbrand
-2
echo a 
read a
echo b
read b
c=`expr $a + $b`
echo $c
prasanna
la source
-3
echo "addition of two number"

echo "enter a number"
read a
echo "enter a number"
read b

c=`expr $a + $b`

echo $c
kishan
la source
3
Cela ne répond pas à la question. Une explication serait utile.
Bernhard