ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Использование арифметических операторов в сценариях 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