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

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: