[Video] v20.19 Утилита expr. Математические операции с целыми числами.

Сегодня я расскажу о том как можно производить простые вычисления в коммандной оболочке.
Для этого я буду использовать утилиту expr.
expr – evaluate expressions – вычислить выражение.

Вот мой скрипт:

~/mytest.dir$ cat script3.sh
# this script is about calculations:
a=10
b=5
c=$1
d=$2
echo "a=$a"
echo "b=$b"
echo "c=$c"
echo "d=$d"
echo
echo 'a+b= '`expr $a + $b`
echo 'a-b= '`expr $a - $b`
echo 'a/b= '`expr $a / $b`
echo 'a*b= '`expr $a \* $b`
echo
echo 'c+d= '`expr $c + $d`
echo 'c-d= '`expr $c - $d`
echo 'c/d= '`expr $c / $d`
echo 'c*d= '`expr $c \* $d`

Что в нём происходит:
Сначала объявляются переменные a и b. Этим переменным присваиваются значения 10 и 5.
Далее переменным c и d присваиваются значения полученные при запуске скрипта из Позиционных параметров о которых я рассказывал в предыдущих видео.
Далее идёт информационная секция с утилитой echo – использую кавычки для вывода текстовой информации и машинописный обратный апостроф для утилиты expr – ими я сообщаю оболочке, что нужно выполнить то что написано внутри них и вывести уже результат.
Производятся различные математические операции.

Рассмотрим пример:
~/mytest.dir$ bash script3.sh 2 3
a=10
b=5
c=2
d=3
a+b= 15
a-b= 5
a/b= 2
a*b= 50
c+d= 5
c-d= -1
c/d= 0 <----------| утилита не может посчитать дробные значения! c*d= 6

Для работы с дробными числами используются другие утилиты, но о них позже. expr утилита простая и лёгкая, если вам не нужно вычислять дробные значения, то она вам пригодится!
Как видите в данного или подобном скрипте можно заложить какие либо вычисления, формулы и производить вычисления исходя из каких-либо констант - в данном примере переменные a и b, а так же использовать данные вводимые самостоятельно при вызове скрипта или пользоваться результатами других скриптов - я говорю о позиционных параметрах.

Хочу показать дополнительно, что будет если использовать кавычки или апострафы вместо машинописного обратного апострофа?
alex@srv-sc-01:~/mytest.dir$ cat script3.sh
<вырезано>
echo 'c+d= '"expr $c + $d" <-------| кавычки echo 'c-d= ''expr $c - $d' <-------| апострафы echo 'c/d= '`expr $c / $d` echo 'c*d= '`expr $c \* $d`

~/mytest.dir$ bash script3.sh 2 3
<вырезано>
c+d= expr 2 + 3 <-------| c-d= expr $c - $d <-------| c/d= 0 c*d= 6

При написании скрипта нужно всегда помнить о простых математических правилах и приоритетах. Операция сложения и вычитания имеюют более низкий приоритет перед умножением и делением. Операции выполняемые в скобках - выполняются оттельно.
echo
echo 'a+b*b-a/b+b*(a-b)= '`expr $a + $b \* $b - $a / $b + $b \* \( $a - $b \)`

Результат:
a+b*b-a/b+b*(a-b)= 58
10+5*5-10/5+5*(10-5)=10+25-2+5*5=35-2+25=60-2=58

Что ещё можно делать с помощью данной утилиты?
Например, производить логические операции - больше, меньше, равер, неравен и тп:
$ expr 1 "<" 3 1 $ expr 3 "<" 1 0 $ expr 0 "!=" 9 1 $ expr 9 "!=" 9 0

Как это можно использоваться? Для чего это нужно?
Полезно если в скриптах вы производите анализ каких-либо получаемых от других служб или скриптов данных данных.
Проверка доступности какого-либо сайта, работоспособности Интернета и тп.
Можно подставить значения переменных в эти выражения и сравнивать получаемые результаты прямо в процессе тестирования.

На сегодня всё, надеюсь вам понравилось.
Удачи!

Sources:
1
2
man - expr