Найти в Дзене
LITVINOV-UPGRADE-LINUX

Bash - арифметические операции

Существует несколько способов выполнять вычисления внутри скрипта или командной строки, рассмотрим эти способы: Рассмотрим эти способы подробнее: let "выражение" a=5
b=3
let sum=a+b
let diff=a-b
let prod=a*b
let div=a/b
let mod=a%b
echo "Сумма: $sum"
echo "Разность: $diff"
echo "Произведение: $prod"
echo "Деление: $div"
echo "Остаток от деления: $mod" Конструкция $(( )) используется для выполнения арифметических вычислений. Это встроенный механизм, позволяющий выполнять операции с целыми числами прямо в командной строке или скриптах. let "выражение" x="3"
y="2"
echo "$(( $x * ( $y + 1 ) ))" astra@astra:~$ echo $((5 + 3))
8
astra@astra:~$ echo $((10 * 2 - 3))
17
astra@astra:~$ a=15
astra@astra:~$ b=7
astra@astra:~$ echo $((a + b))
22
astra@astra:~$ echo $((9 / 2)) # (целочисленное деление)
4
astra@astra:~$ # Проверка условий:
astra@astra:~$ x=10
astra@astra:~$ if ((x > 5)); then
> echo "x больше 5"
> fi
x больше 5 expr аргумент1 оператор аргумент2 expr работает только
Оглавление

Вступление

Существует несколько способов выполнять вычисления внутри скрипта или командной строки, рассмотрим эти способы:

  1. команда let
  2. $(( )) (предпочтительный способ)
  3. expr (устаревший метод)
  4. Операции с плавающей точкой (bc — калькулятор)
  5. awk (текстовый обработчик)
  6. Инкремент и декремент

Рассмотрим эти способы подробнее:

1. Арифметика с использованием let

1.1 Синтаксис:

let "выражение"

1.2 Основные особенности

  • Арифметические операции: +, -, *, /, % (остаток от деления), ** (возведение в степень).
  • Инкремент и декремент: ++ и --.
  • Поддерживает логические и побитовые операции: &, |, ^, <<, >>.
  • Переменные не требуют явного указания $ при использовании внутри выражения.

1.3 Пример

a=5
b=3

let sum=a+b
let diff=a-b
let prod=a*b
let div=a/b
let mod=a%b

echo "Сумма: $sum"
echo "Разность: $diff"
echo "Произведение: $prod"
echo "Деление: $div"
echo "Остаток от деления: $mod"

2. $(( )) (предпочтительный способ)

Конструкция $(( )) используется для выполнения арифметических вычислений. Это встроенный механизм, позволяющий выполнять операции с целыми числами прямо в командной строке или скриптах.

2.1 Синтаксис

let "выражение"

2.2 Особенности

  • Внутри $(( )) можно использовать стандартные арифметические операторы.
  • Поддерживаются как простые, так и сложные выражения.
  • $(( )) работает только с целыми числами (не поддерживает числа с плавающей точкой).

2.3 Примеры

x="3"
y="2"
echo "$(( $x * ( $y + 1 ) ))"

astra@astra:~$ echo $((5 + 3))
8
astra@astra:~$ echo $((10 * 2 - 3))
17
astra@astra:~$ a=15
astra@astra:~$ b=7
astra@astra:~$ echo $((a + b))
22
astra@astra:~$ echo $((9 / 2)) # (целочисленное деление)
4
astra@astra:~$ # Проверка условий:
astra@astra:~$ x=10
astra@astra:~$ if ((x > 5)); then
> echo "x больше 5"
> fi
x больше 5

3. Через expr (устаревший метод)

3.1 Синтаксис

expr аргумент1 оператор аргумент2

expr работает только с целыми числами.

3.2 Пример

a=7
b=2

sum=$(expr $a + $b)
diff=$(expr $a - $b)
prod=$(expr $a \* $b) # Важно: умножение экранируется
div=$(expr $a / $b)
mod=$(expr $a % $b)

echo "Сумма: $sum"
$ echo "Разность: $diff"
Разность: 5
$ echo "Произведение: $prod"
Произведение: 14
$ echo "Деление: $div"
Деление: 3
$ echo "Остаток: $mod"
Остаток: 1

3.3 Дополнительные возможности

astra@astra:~$ expr length "hello" #Длина
5
astra@astra:~$ expr substr "abcdef" 2 3 #Извлечение подстроки (Начало = 2, Длина = 3)
bcd
astra@astra:~$ expr index "abcdef" "c" #Позиция подстроки\
3
#Логические операции
#Сравнение чисел
astra@astra:~$ expr 5 \< 10
1
astra@astra:~$ expr 10 = 10
1
astra@astra:~$ expr 5 \> 10
0
astra@astra:~$ expr 0 \| 1
#Логическое "ИЛИ" (|):
1

4. Операции с плавающей точкой плавающей точкой (bc — калькулятор)

4.1 Синтаксис

bc [опции] [файл]

bc - Язык калькулятора произвольной точности

4.2 Основные возможности bc

  1. Арифметические операции: сложение (+), вычитание (-), умножение (*), деление (/), остаток от деления (%).
  2. Работа с десятичными дробями: задается параметром scale.
  3. Математические функции: sqrt() — квадратный корень, s() — синус, c() — косинус и т. д. (при использовании -l).
  4. Использование переменных: присваивание значений и вычисление с переменными.
  5. Поддержка циклов и условий: конструкции if, while, for.

4.3 Опции

  • -l Включает математическую библиотеку (sin, cos, sqrt и др.)
  • -q Отключает приветственное сообщение в интерактивном режиме
  • -w Показывает предупреждения (если есть)

4.4 Пример

a=5.5
b=2.2

sum=$(echo "$a + $b" | bc)
diff=$(echo "$a - $b" | bc)
prod=$(echo "$a * $b" | bc)
div=$(echo "scale=2; $a / $b" | bc) # scale=2 — два знака после запятой

echo "Сумма: $sum"
Сумма: 7.7
echo "Разность: $diff"
Разность: 3.3
echo "Произведение: $prod"
Произведение: 12.1
echo "Деление: $div"
Деление: 2.50

4.5 Дополнительные функции

astra@astra:~$ echo "2 + 3 * 4" | bc
14
astra@astra:~$ echo "scale=3; 10 / 3" | bc
3.333
astra@astra:~$ echo "scale=4; sqrt(25)" | bc
5.0000
astra@astra:~$ echo "x=10; y=5; x*y" | bc
50
astra@astra:~$ echo "s(1)" | bc -l # Синус 1 радиана
.84147098480789650665

4.6 Интерактивный калькулятор

astra@astra:~$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
5+3
8
quit

5. awk (текстовый обработчик)

awk — это мощный текстовый обработчик, который часто используется в UNIX-подобных системах для анализа и обработки текстовых данных. Он поддерживает встроенные арифметические операции и может использоваться как калькулятор или инструмент для сложных вычислений.

5.1 Примеры

Заполняю файл data.txt числами и затем обрабатываю

astra@astra:~$ echo 10 >>data.txt
astra@astra:~$ echo 20 >>data.txt
astra@astra:~$ echo 30 >>data.txt
astra@astra:~$ awk '{sum += $1} END {print "Сумма:", sum}' data.txt
Сумма: 60
astra@astra:~$ awk '{sum += $1; count++} END {print "Среднее:", sum / count}' data.txt
Среднее: 20
astra@astra:~$ echo 5 | awk '{print $1^2}'
25
astra@astra:~$ awk 'BEGIN {a = 7 / 3; printf("%.2f\n", a)}'
2.33
astra@astra:~$ awk 'BEGIN {print sqrt(25), int(4.7), rand()}'
5 4 0.924046

6. Инкремент и декремент

astra@astra:~$ a=10
astra@astra:~$ ((a++))  # Увеличить на 1
astra@astra:~$ echo "a после инкремента: $a"
a после инкремента: 11
astra@astra:~$  
astra@astra:~$ ((a--))  # Уменьшить на 1
astra@astra:~$ echo "a после декремента: $a"
a после декремента: 10