Арифметические операции в 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
alias: Псевдонимы
Bash Scripting
-eq -gt …: Операторы сравнения
if else: Условные операторы
Цикл while
date: Дата
Переход на новую строку
Арифметические операции
sftp: Передать файл или пароль в Bash скрипте
Мониторинг потребления памяти
Работа с файлами в директории
awk
grep
sed
Ошибки Bash
Zsh