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

Как выполнять арифметические операции в Bash

Различные способы выполнения математических операций в Bash

В этой статье мы сосредоточимся на том, как выполнять математические операции в скриптах bash. Мы можем выполнять арифметические операции в Bash, используя встроенные и внешние инструменты. Сначала мы узнаем о встроенных инструментах.

Примечание. В отличие от других языков программирования, арифметические операции bash не являются простыми (по крайней мере, для меня). Существует несколько встроенных и внешних программ bash для выполнения одних и тех же операций. Если вы хотите выполнить какие-либо сложные математические вычисления, оболочка не рекомендуется для этого.

Выполняйте математические операции в Bash, используя встроенную команду let.

С помощью команды let вы можете выполнять арифметические, инкрементные, побитовые и условные операции. Недостаток команды let заключается в том, что она не может обрабатывать значения с плавающей запятой.

Команда let в bash является встроенной командой. Вы можете убедиться в этом, выполнив следующую команду в терминале.

type -a let
let is a shell builtin

Выполните следующую команду, чтобы получить раздел справки, где вы можете найти список операторов, поддерживаемых командой let.

let -help

Пример вывода:

Отображение раздела справки по команде let

При работе с командой let следует учитывать несколько важных моментов.

  • Выходные данные любой операции следует присвоить переменной, а затем распечатать. Команда «let» не позволит вам сразу распечатать результаты.
  • Между оператором и операндом не допускается пробел.

Создайте сценарий оболочки, скопируйте и вставьте приведенный ниже пример кода и попробуйте запустить сценарий. В приведенном ниже коде я выполняю арифметические операции. Как уже упоминалось, вывод выражения должен быть присвоен переменной перед его печатью.

#!/usr/bin/env bash

let NUMBER1=10
let NUMBER2=3

Addition => + operator
let ADD=$NUMBER1+$NUMBER2
echo "Addition of two numbers : ${ADD}"

Subtraction => - operator
let SUB=$NUMBER1-$NUMBER2
echo "Subtraction of two numbers : ${SUB}"

Multiply => * operator
let MUL=$NUMBER1*$NUMBER2
echo "Multiply two numbers : ${MUL}"

Divide => / operator
let DIV=$NUMBER1/$NUMBER2
echo "Division of two numbers : ${DIV}"

Remainder => % operator
let REM=$NUMBER1%$NUMBER2
echo "Remainder of two numbers : ${REM}"

Exponent => ** operator
let EXPO=$NUMBER1**$NUMBER2
echo "Exponent of two numbers : ${EXPO}"

Выполняйте математические операции в сценариях Bash

Вы также можете выполнять операции пост-инкремента и пост-декремента. Эта операция будет чаще всего использоваться, когда мы запускаем циклы в скрипте.

  • Операция пост-инкремента увеличит значение переменной до VARIABLE + 1.
  • Операция предварительного увеличения увеличит значение переменной до VARIABLE - 1.
let variable++
let variable--

Выполняйте операции пост-инкремента и пост-декремента

Вы также можете выполнять другие операции сравнения, такие как проверка на равенство, неравенство, больше, меньше и т. д. Я настоятельно рекомендую не использовать команду let для выполнения каких-либо операций сравнения, поскольку есть более эффективные способы обработки. это.

Выполняйте арифметические операции в Bash, используя встроенные двойные скобки

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

Преимущество этого метода перед командой let заключается в том, что результат можно сразу распечатать или сохранить в переменной, а между оператором и операндом можно добавлять пробелы. Как и в случае с командой let, вы не можете выполнять операции с плавающей запятой.

Пример, приведенный ниже, во многом аналогичен примерам, показанным в команде let. Все, что вам нужно сделать, это поместить выражение в двойные скобки. Нет необходимости добавлять к переменным символ $ внутри двойных скобок. Просто укажите имя переменной, и значение будет интерпретировано.

На изображении ниже, если вы видите строки 12 и 13, вы увидите разницу в том, как обрабатывается выражение. Все, что находится в скобках, будет сначала оценено, а результат будет вычислен относительно других операндов. Это поведение можно увидеть в выводе команд "Multiply" и "Multiply1".

Выполнение арифметических операций в сценариях Bash с использованием двойных скобок

Подобно команде let, вы также можете выполнять операции увеличения и уменьшения.

((NUMBER2++)
((NUMBER1--))

Вы также можете выполнять сокращенные операции.

(( NUMBER2 = NUMBER2 + 10 ))
(( NUMBER2 += 10 )) # Shorthand

Выполнение операций пост-инкремента и декремента

Выполнение арифметических операций в Bash с помощью утилиты Expr

В предыдущих разделах мы рассмотрели встроенные функции, а в этом разделе мы рассмотрим "expr", который является внешней программой.

Утилита expr может выполнять не только математические операции, но и операции со строками, такие как поиск индекса символа, длины строки, подстроки и т. д.

Прежде чем использовать программу expr, просмотрите справочную страницу, которая даст вам некоторое представление об этой утилите.

man expr
expr -help

Ниже приведен синтаксис команды expr:

expr

Основная арифметическая операция такая же, как и в предыдущих разделах. Единственное отличие здесь заключается в том, что при использовании * для выполнения операции умножения вам необходимо экранировать ее с помощью "\", иначе будет выдана ошибка.

expr 10 + 3 # Addition
expr 10 - 3 # Subtraction
expr 10 * 3 # Multiply
expr 10 / 3 # Divide
expr 10 % 3 # Remainder

Выполнение арифметических операций в Bash с помощью утилиты Expr

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

Общим для этих трех подходов является то, что они не могут обрабатывать операции с плавающей запятой. Для выполнения операций с плавающей запятой вам придется полагаться на внешние утилиты, такие как awk и bc.

Выполнение арифметических операций Bash с помощью утилиты bc

Утилита bc — это внешняя программа, которую можно использовать для выполнения как простых, так и сложных математических операций. Операции с плавающей запятой также поддерживаются утилитой bc.

Вы можете просмотреть тип утилиты bc и ее справочную страницу, используя следующие команды:

type -a bc
man bc

Следующие примеры показывают простые математические операции с целыми и плавающими значениями.

Add
echo "10 + 100" | bc
=> 110

echo "10.15 + 11.20" | bc
21.35

Subtract
echo "100 - 25" | bc
=> 75

echo "100 - 25.5" | bc
=> 74.5

Multiply
echo "10 * 5" | bc
=> 50

echo "10.10 * 4" | bc
=> 40.40

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

without scale
echo "10.10 / 4" | bc
=> 2
with scale
echo "scale=2;10.10 / 4" | bc
=> 2.52

Вы также можете выполнить операцию экспоненты.

echo "2.2^4" | bc
=> 23.4

Выполняйте математические операции с AWK

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

Ниже приведен синтаксис для выполнения математических вычислений.

awk "BEGIN {print expression }"

Чтобы выполнить простое умножение, выполните:

awk "BEGIN {print 23 * 4.5 }"
=> 103.5

Из значения с плавающей запятой вы можете получить только целое значение, используя функцию int.

awk "BEGIN{print int(10.111) }"
=> 10

Вы также можете вычислить квадратный корень из заданного числа, используя функцию sqrt.

awk "BEGIN{print sqrt(10) }"
=> 3.16228

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

Поскольку это файл CSV, я устанавливаю разделитель полей (-F «, »). Здесь сначала добавляется весь второй столбец и делится на NR (количество записей).

awk -F "," '{sum+=$2} END { print "average value from column 2 = ",sum/NR}' data.csv

В ближайшие дни мы опубликуем подробное руководство по awk.

Заключение

В этой статье я показал вам различные методы выполнения простых математических операций в Bash. Если вы выполняете очень простые арифметические операции, придерживайтесь метода двойных скобок, а для более сложных операций используйте awk.

Статьи по данной тематике