ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)
Понедельник, 31 марта, 2025
Сегодня у нас 1 праздник:
Международный День Резервного Копирования (World Backup Day). Пользователи сайта социальных новостей reddit предложили сделать дату 31.03 Международным днём резервного копирования, аргументируя это тем, что никогда заранее нельзя узнать, какие сюрпризы преподнесёт 1.04

Использование арифметических операторов в сценариях Bash

Создание и запуск своего первого сценария оболочки Bash

Давайте займемся математикой в Bash!

При написании сценариев bash вы часто обнаруживаете, что хотите выяснить результат арифметических вычислений, чтобы определить оставшееся дисковое пространство, размеры файлов, срок действия пароля, количество хостов, пропускную способность сети и т. д.

В этой главе серии статей о bash для начинающих вы научитесь использовать операторы bash для выполнения различных арифметических вычислений.

Чтобы освежить вашу память, вот арифметические операторы в bash:

оператор Описание
+ прибавление
субстракция
* умножение
/ целочисленное деление (без десятичных чисел)
% деление модуля (дает только остаток)
** возведение в степень (x в степени y)

Выполнение сложения и вычитания в сценариях bash

Давайте создадим bash-скрипт с именем add.sh , который просто добавит два размера файла (в байтах) и отобразит результат.

К настоящему времени вы должны быть знакомы с аргументами в сценариях bash. Надеюсь, вы также знакомы с командами cut и du.

Команда du дает вам размер файла. В выводе указывается как размер файла, так и имя файла. Здесь команда cut используется для извлечения первого столбца (т.е. размера файла) из вывода. Выходные данные команды du передаются команде cut с использованием перенаправления конвейера.

Вот сценарий:

#!/bin/bash

fs1=$(du -b $1 | cut -f1)
fs2=$(du -b $2 | cut -f1)

echo "Размер файла $1 is: $fs1"
echo "Размер файла $2 is: $fs2"

total=$(($fs1 + $fs2))

echo "Общий размер составляет: $total"

 

Обратите внимание, что вы передадите два имени файла в качестве аргументов сценарию. Например, здесь мы запускаем сценарий и передаю два файла /etc/passwd и /etc/group в качестве аргументов:

MasterEx@andreyex:~/scripts$ ./addition.sh /etc/passwd /etc/group
Размер файла /etc/passwd is: 2795
Размер файла /etc/group is: 1065
Общий размер составляет: 3860

 

Наиболее важное направление в сценарии addition.sh:

total=$(($fs1 + $fs2))

 

Где вы использовали оператор + для сложения двух чисел $fs1 и $fs2. Также обратите внимание, что для вычисления любого арифметического выражения вы должны заключить его в двойные круглые скобки следующим образом:

$((arithmetic-expression))

 

Вы также можете использовать оператор минус (-) для вычитания. Например, значение под-переменной в следующем операторе будет равно семи:

sub=$((10-3))

 

Выполнение умножения и деления в сценариях bash

Давайте создадим сценарий bash с именем giga2mega.sh, который преобразует гигабайты (ГБ) в мегабайты (МБ):

#!/bin/bash

GIGA=$1
MEGA=$(($GIGA * 1024))

echo "$GIGA GB is equal to $MEGA MB"

 

Теперь давайте запустим скрипт, чтобы узнать, сколько мегабайт в четырех гигабайтах:

MasterEx@andreyex:~/scripts$ ./giga2mega.sh 4
4 GB is equal to 4096 MB

 

Здесь мы использовали оператор умножения (*), чтобы умножить количество гигабайт на 1024, чтобы получить эквивалент в мегабайтах:

MEGA=$(($GIGA * 1024))

 

В этот скрипт легко добавить дополнительные функции для преобразования гигабайт (ГБ) в килобайты (КБ):

KILO=$(($GIGA * 1024 * 1024))

 

Мы позволим вам преобразовать гигабайты в байты в качестве практического упражнения!

Вы также можете использовать оператор деления (/), чтобы разделить два числа. Например, значение переменной div в следующем операторе будет равно пяти:

div=$((20 / 4))

 

Обратите внимание, что это целочисленное деление, поэтому все дроби теряются. Например, если вы разделите 5 на 2, вы получите 2, что, конечно, неверно:

MasterEx@andreyex:~/scripts$ div=$((5 / 2))
MasterEx@andreyex:~/scripts$ echo $div
2

 

Чтобы получить десятичный вывод; вы можете использовать команду bc. Например, чтобы разделить 5 на 2 с помощью bc команды, вы можете использовать следующий оператор:

echo "5/2" | bc -l
2.50000000000000000000

 

Обратите внимание, что вы можете использовать и другие операторы с bc командой всякий раз, когда имеете дело с десятичными числами.

 

Использование power и остатка (по модулю)

Создадим калькулятор мощности! Мы собираемся создать скрипт с именем power.sh, который будет принимать два числа a и b (в качестве аргументов) и будет отображать результат возведения a в степень b:

#!/bin/bash
a=$1
b=$2
result=$((a**b))
echo "$1^$2=$result"

 

Обратите внимание, что мы используем оператор возведения в степень (**) , чтобы вычислить результат a в степени b.

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

MasterEx@andreyex:~/scripts$ ./power.sh 2 3
2^3=8
MasterEx@andreyex:~/scripts$ ./power.sh 3 2
3^2=9
MasterEx@andreyex:~/scripts$ ./power.sh 5 2
5^2=25
MasterEx@andreyex:~/scripts$ ./power.sh 4 2
4^2=16

 

Вы также можете использовать оператор по модулю (%) для вычисления целочисленных остатков. Например, значение переменной rem в следующем операторе будет равно 2:

rem=$((17%5))

 

Остаток здесь 2, потому что 5 в 17 три раза, а два остается!

 

Время практики: создание сценария bash для конвертера степеней

Давайте завершим это руководство, создав скрипт с именем c2f.sh , который преобразует градусы Цельсия в градусы Фаренгейта, используя уравнение ниже:

F = C x (9/5) + 32

 

Это будет хорошее упражнение для вас, чтобы попробовать новые вещи, которые вы только что узнали в этом руководстве по bash.

Вот решение (может быть несколько способов добиться того же результата):

#!/bin/bash

C=$1
F=$(echo "scale=2; $C * (9/5) + 32" | bc -l)

echo "$C градусов Цельсия приравнивается к $F градусов по Фаренгейту."

 

Мы использовали команду bc, потому что мы имеем дело с десятичными знаками, и мы также использовали «scale = 2» для отображения вывода в двух десятичных точках.

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

MasterEx@andreyex:~/scripts$ ./c2f.sh 2
2 градусов Цельсия равно 35.60 градусов по Фаренгейту.
MasterEx@andreyex:~/scripts$ ./c2f.sh -3
-3 градусов Цельсия равно 26.60 градусов по Фаренгейту.
MasterEx@andreyex:~/scripts$ ./c2f.sh 27
27 градусов Цельсия равно 80.60 градусов по Фаренгейту.

 

Отлично! На этом мы подошли к концу этой статьи. Надеюсь, вам понравилось заниматься математикой с помощью bash.

Exit mobile version