🏠 | 💻 IT | Linux | Bash |

Арифметические операции в 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

Let's break it down:

Line 4 - Это базовый синтаксис. Обратите внимание на пробелы и на отсутствие кавычек.

Line 6 - Если заключить выражение в кавычки его в таком виде и выведет в терминал.

Line 8 - Если не поставить пробелы выражение будет выведено в терминал без вычисления.

Line 10 - Некоторые символы нужно экранировать.

Line 12 - Это деление по модулю. Результатом будет остаток от целочисленного деления двух чисел.

Line 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

Разберём этот скрипт:

Line 4 - Базовый синтаксис. Можно ставить пробелы без использования кавычек.

Line 7 - Работает и без пробелов.

Line 10 - Можно использовать переменные без $ перед ними.

Line 13 - А можно и с $

Line 16 - Увеличение переменной на 1. Символ $ не нужен.

Line 19 - Увеличение переменной на 3. Это краткая форма записи b = b + 3.

Line 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
Bash Scripting
-eq -gt …: Операторы сравнения
if else: Условные операторы
Цикл while
date
Переход на новую строку
Передать файл или пароль по SFTP в Bash скрипте
Ошибки Bash
Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящуюю по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: