Додавання двох чисел за допомогою 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замість цього $((...))є бажанням бути переносним до класичної оболонки Борна, то цього варто також уникати $(...).
Алан Карі

2
@AlanCurry Чи є снаряди, які не підтримують $()? Наскільки я знаю, це вимагає posix, наприклад, всі оболонки, сумісні з posix, повинні підтримувати$()
Ulrich Dangel

1
@UlrichDangel Оригінальної оболонки Борна не було $(…), але вона приблизно вимерла (можливо, хтось десь ще працює /bin/shна Solaris).
Жил "ТАК - перестань бути злим"

Оболонка C не підтримує $(…)- або, принаймні, не всі версії.
Скотт

Яка мета створення подвійних лапок навколо змінних?
kojow7

9

Ви, мабуть, неправильно прочитали посилання як окремі лапки в рядку:

sum = 'expr $num1 + $num2'

Дивіться, як$(...) замість цього використовується Wiki Greg .

Це працює, як очікувалося:

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

Також зауважте, що навколо знака рівняння немає прогалин (призначення змінної).


1

exprце зовнішня програма, використовувана оболонкою Bourne (тобто sh). Оболонка Борна спочатку не мала механізму виконувати просту арифметику. Він використовує exprзовнішню програму за допомогою backtick.

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

Ви можете використовувати один backtick ( `ключ)


1
Це зворотний хід, і його рекомендується використовувати $( ... )замість раковин. Крім того, проблема полягає в тому, що ОП використовує простори, де вони не повинні.
фонбранд


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