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?


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

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


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)

0

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

sum=$((num1+num2))

-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

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`"

-2

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


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


-3
echo "addition of two number"

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

c=`expr $a + $b`

echo $c

3
Cela ne répond pas à la question. Une explication serait utile.
Bernhard
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.