Давайте займемся математикой в 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.