Арифметические операции в Bash скрипте
Введение | |
let | |
expr | |
Двойные скобки | |
Сложение | |
Целочисленное деление | |
Остаток от деления | |
bc: float сложение | |
bc: float деление | |
bc: float умножение | |
Похожие статьи |
Введение
В bash существует множество способов выполнения арифметических операций. В этой статье вы найдёте подробный обзор использования let, expr, (()) и bc
Let
let это встроенная функция bash, которая позволяет производить базовые арифметические операции.
Используется следующим образом:
let <арифметическая операция>
Рассмотрим примеры в скрипте let_example.sh
#!/bin/bash
# Простая арифметика с let
let A=5+4
echo $A # 9
let "A = 5 + 4"
echo $A # 9
let A++
echo $A # 10
let "A = 4 * 5"
echo $A # 20
let "A = $1 + 30"
echo $A # 30 + первый аргумент из командной строки
Разберём команды по очереди:
Строка 4 - Это простейшая форма записи без кавычек.
Помните, что если вычисление идёт без кавычек - ставить пробелы нельзя
Строка 7 - Если поставить кавычки - можно пользоваться пробелом для лучшей читаемости.\
Строка 10 - Увеличиваем значение на 1. Это аналог "a = a + 1".
Строка 16 - В выражение можно включить и другие переменные.
./let_example.sh 11
9
9
10
20
41
Таблица основных операторов
Оператор | Операция |
---|---|
+, -, \*, / | Сложение, вычитание, умножение, деление |
var++ | Увеличение переменной на 1 |
var-- | Уменьшение переменной на 1 |
% | Модуль: возвращает остаток от деления |
РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе
Конец рекламы. Если там пусто считайте это рекламой моей телеги
expr
expr похож на let за исключением того, что вместо сохранения результата в переменную expr по умолчанию печатает ответ.
Но никто не запрещает сохранять результат expr в переменные с помощью command substitution: x = $(expr 2 + 2)
В отличие от let не нужно заключать выражения с пробелами в кавычки
Нужно ставить пробелы вокруг операторов.
expr item1 operator item2
Рассмотрим простой пример:
expr_example.sh
#!/bin/bash
# Простая арифметика с использованием expr
expr 5 + 4
expr "5 + 4"
expr 5+4
expr 5 \* $1
expr 11 % 2
A=$( expr 10 - 3 )
echo $A # 7
Разберём этот пример пошагово:
Строка 4 - Это базовый синтаксис. Обратите внимание на пробелы и на отсутствие кавычек.
Строка 6 - Если заключить выражение в кавычки его в таком виде и выведет в терминал.
Строка 8 - Если не поставить пробелы выражение будет выведено в терминал без вычисления.
Строка 10 - Некоторые символы нужно экранировать.
Строка 12 - Это деление по модулю. Результатом будет остаток от целочисленного деления двух чисел.
Строка 14 - Пример выполнения command substitution чтобы сохранить результат в переменную a.
./expr_example.sh 12
9
5 + 4
5+4
60
1
7
Двойные скобки
Результат выполнения команды можно легко сохранить в переменную.
VAR=$(какая-то команда)
На основе этого механизма можно выполнять арифметические действия. Достаточно вместо одной пары скобок использовать две.
$(( expression ))
Рассмотрим примеры в скрипте
expansion_example.sh
#!/bin/bash
# Простая арифметика с двойными скобками
A=$(( 4 + 5 ))
echo $A # 9
A=$((3+5))
echo $A # 8
B=$(( A + 3 ))
echo $B # 11
B=$(( $A + 4 ))
echo $B # 12
(( B++ ))
echo $B # 13
(( B += 3 ))
echo $B # 16
A=$(( 4 * 5 ))
echo $A # 20
Разберём этот скрипт:
Строка 4 - Базовый синтаксис. Можно ставить пробелы без использования кавычек.
Строка 7 - Работает и без пробелов.
Строка 10 - Можно использовать переменные без $ перед ними.
Строка 13 - А можно и с $
Строка 16 - Увеличение переменной на 1. Символ $ не нужен.
Строка 19 - Увеличение переменной на 3. Это краткая форма записи b = b + 3.
Строка 19 - В отличие от других способов символ * не нужно экранировать.
./expansion_example.sh
9
8
11
12
13
16
20
Двойные скобки дают довольно много свободы в форматировании кода.
Они доступны в Bash по умолчанию и их эффективность немного выше. Хотя заметить разницу на современных компьютерах будет непросто.
Сложение
Сложение в bash можно выполнить следущими способами
#!/bin/bash
# Bash +
# let
A=2
B=3
let C=$A+$B
echo $C
./add.sh
5
#!/bin/bash
# Bash +
# expr and (( ))
D=4
E=5
F=$( expr $D + $E )
G=$(( $D + $D ))
echo $F
echo $G
./add.sh
9
8
Целочисленное деление
В bash по умолчанию реализовано именно целочисленное деление
Рассмотрим, что будет если попытаться поделить числа с помощью let
#!/bin/bash
# Целочисленное деление
A=100
B=3
let "C = $A / $B"
echo "C: $C"
C: 33
Дробная часть потерялась
Если вас это не устраивает - используйте
bc
Остаток от деления
Остаток от деления можно получить с помощью % следующим оригинальным образом
a=6
b=$(($a%5))
echo $b
1
Float Сложение
Сложение чисел с плавающей точкой можно выполнить с помощью bc
#!/bin/bash
# Bash +
# bc
X=1.5
Y=3.5
Z=$(bc<<<"scale=3;$X+$Y")
echo "1.5 + 3.5 = " $Z
./add.sh
1.5 + 3.5 = 5.0
bc
В bash нет родной поддержки деления чисел с плавающей точкой. Но есть утилиты, которые умеют это делать.
Одна из них это bc
Что будет если попытаться поделить числа с помощью let
#!/bin/bash
# Деление с let
A=100
B=3
let "C = $A / $B"
echo "C: $C"
C: 33
Дробная часть потерялась
Чтобы этого не произошло используйте bc
# Деление с bc
D=$(bc<<<"scale=3;$A/$B")
echo "D: $D"
D: 33.333
bc: float умножение
Также с помощью bc удобно умножать числа с плавающей запятой
#!/bin/bash
# Умножение с bc
A=2.5
B=5.6
С=$(bc<<<"scale=3;$A*$B")
echo "С: $C"
C: 14.00
Bash | |
Основы Bash | |
Скрипты | |
awk | |
grep | |
sed | |
Ошибки Bash | |
Zsh | |
Unix |