Я могу прочитать числа и выполнить операции с помощью:
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
.bc
man bc
решение3
Вы также можете использовать $[ ... ]
структуру. В этом случае мы используем встроенный механизм в Bash, который быстрее и немного удобнее в использовании. Поскольку мы знаем, что все между $[, и ] рассматривается как выражение, нам не нужно предварять переменные $
. Аналогично, нам не нужно защищаться *
от рассмотрения его как шаблона.
num1=2
num2=3
echo $[num1 + num2]
5
решение4
минималистский
total=0
((total+=qty))