Добавление двух чисел с помощью expr

13

Я изучаю сценарии Shell для получения диплома в области ИТ, которым я сейчас занимаюсь. Я пытаюсь написать небольшой скрипт, который добавляет два числа, как показано в одном из учебных пособий, которые нам дали.

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

Однако, когда я даю ему разрешение на выполнение и запускаю скрипт, он выдает мне эту ошибку.

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

введите описание изображения здесь

Я попытался запустить это на Ubuntu и Fedora, но возникает та же ошибка. Может кто-нибудь сказать мне, что мне здесь не хватает?

Isuru
источник
Связанный: unix.stackexchange.com/questions/40786/…
Бернхард

Ответы:

39

Сначала вы должны избавиться от мест для назначения, например,

sum='expr $num1 + $num2'

то вы должны изменить 'к `или даже лучше $():

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

вместо использования exprвы также можете сделать расчет прямо в вашей оболочке:

sum=$((num1 + num2))
Ульрих Дангел
источник
3
Если мотивация использовать exprвместо этого $((...))- желание быть переносимым на классическую оболочку Bourne, то также стоит избегать этого $(...).
Алан Карри
2
@AlanCurry есть какие-нибудь оболочки, не поддерживающие $()? Насколько я знаю, это требуется по posix, например, все оболочки, совместимые с posix, должны поддерживать$()
Ульрих Дангел
1
@UlrichDangel У оригинальной оболочки Bourne не было $(…), но она почти вымерла (возможно, кто-то где-то еще работает /bin/shна Solaris).
Жиль "ТАК - перестать быть злым"
Оболочка C не поддерживает $(…)- или, по крайней мере, не все версии.
Скотт
Для чего нужны двойные кавычки вокруг переменных?
kojow7
9

Возможно, вы неправильно прочитали обратные пометки в виде одинарных кавычек в строке:

sum = 'expr $num1 + $num2'

Смотрите вики Грега по использованию $(...)вместо этого.

Это работает как ожидалось:

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

Также обратите внимание, что вокруг знака равенства нет пробелов (присвоение переменной).

jasonwryan
источник
1

exprэто внешняя программа, используемая оболочкой Bourne (т.е. sh) У оболочки Борна изначально не было никакого механизма для выполнения простой арифметики. Он использует exprвнешнюю программу с помощью backtick.

Обратный удар ( ` ) на самом деле называется подстановкой команд. Подстановка команд - это механизм, с помощью которого оболочка выполняет заданный набор команд, а затем заменяет их вывод вместо команд.

sum=`expr $num1 + $num2`

В bash (bourne again shell) он имеет следующий системный синтаксис, он не использует внешнюю программу expr.

sum=$((num1+num2))

если мы хотим использовать внешнюю программу expr. у нас есть следующий систакс:

sum=$(expr $num1 + $num2)
Premraj
источник
0

Если вы используете bash, вы можете просто сделать что-то вроде этого:

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
Imtiyaz
источник
также добавить описание кода и как это поможет решить вопрос?
Теджас
-1

echo "enter first no :"; read a
echo "enter second no :"; read b
echo "sum = `expr $a + $b`"
Панду Раджу
источник
-2

Вы можете использовать один обратный удар ( `ключ)

прашант сахаре
источник
1
Это обратный удар, и его рекомендуется использовать $( ... )вместо снарядов. Кроме того, проблема в том, что OP использует пробелы там, где их не должно быть.
vonbrand
-2
echo a 
read a
echo b
read b
c=`expr $a + $b`
echo $c
прасанна
источник
-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
источник
3
Это не ответ на вопрос. Некоторое объяснение поможет.
Бернхард