Добавление двух чисел с помощью 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, но возникает та же ошибка. Может кто-нибудь сказать мне, что мне здесь не хватает?


Ответы:


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

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


1

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

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

sum=`expr $num1 + $num2`

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

sum=$((num1+num2))

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

sum=$(expr $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

также добавить описание кода и как это поможет решить вопрос?
Теджас


-2

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


1
Это обратный удар, и его рекомендуется использовать $( ... )вместо снарядов. Кроме того, проблема в том, что OP использует пробелы там, где их не должно быть.
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
Это не ответ на вопрос. Некоторое объяснение поможет.
Бернхард
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.