как можно сложить (вычесть и т. д.) два числа с помощью bash?

как можно сложить (вычесть и т. д.) два числа с помощью bash?

Я могу прочитать числа и выполнить операции с помощью:

echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op

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

case "$op" in
  "+")
    echo num1+num2;;
  "-")
    echo `num1-num2`;;
esac

Бегать:

First number please
1
Second mumber please
2
Operation?
+

Выход:

num1+num2

...или...

echo $num1+$num2;;

# results in: 1+2    

...или...

echo `$num1`+`$num2`;;

# results in: ...line 9: 1: command not found

Кажется, я все еще получаю строки, когда пытаюсь сложить сложение ("2+2" вместо "4").

решение1

Арифметика в оболочках POSIXделается с помощью $двойных скобок (( )):

echo "$(($num1+$num2))"

Вы можете назначить его оттуда; также обратите внимание, что $операторы для имен переменных внутри (())являются необязательными):

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

А также есть expr:

expr $num1 + $num2

В скриптах $(())предпочтительнее, так как это позволяет избежать ветвления/выполнения команды expr.

решение2

Существующий ответ — чистый bash, поэтому он будет быстрее, чем этот, но он может обрабатывать только целые числа. Если вам нужно обрабатывать числа с плавающей точкой, вам придется использовать внешнюю программу bc.

$ echo 'scale=4;3.1415+9.99' | bc
13.1315

Говорит использовать четыре знака после запятой. Для получения дополнительной информации см scale=4.bcman bc

решение3

Вы также можете использовать $[ ... ]структуру. В этом случае мы используем встроенный механизм в Bash, который быстрее и немного удобнее в использовании. Поскольку мы знаем, что все между $[, и ] рассматривается как выражение, нам не нужно предварять переменные $. Аналогично, нам не нужно защищаться *от рассмотрения его как шаблона.

num1=2
num2=3
echo $[num1 + num2]
5

решение4

минималистский

total=0
((total+=qty))

Связанный контент