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

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

Ограничение Bash для арифметических операций

Переменные в bash не являются строго типизированными. По умолчанию все переменные bash являются символьными строками, если они не указаны с помощью declare. Для поддержки арифметических операций над такими строковыми переменными, bash рассматривает переменные как целые числа, если это определено контекстом выполнения. Операторы арифметики/сравнения к переменным, содержащим только цифры, bash автоматически рассматривает переменные как целые числа. Такое автоматическое преобразование строк в целые числа позволяет bash оценивать целочисленную арифметику. Однако bash не поддерживает вычисления с плавающей запятой нативно, и придется полагаться на внешние инструменты, такие как GNU bc, для операций с плавающей запятой.

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

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

Несколько примеров

Результат выполнения операций

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

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

Результат

При использовании чисел с плавающей запятой, bash вернет ошибку "syntax error: invalid arithmetic operator".

Присваивание результата арифметической операции переменной

Для присвоение значения переменной используется следующая конструкция

Пример

Использование команды let

Встроенная команда let позволяет вычислять "вложенное" арифметическое выражение.

Также возможно выполнять несколько арифметических операций в одном операторе let.

Использование команды expr

В отличие от let, которая является встроенной командой bash, expr - это внешняя утилита командной строки. Поскольку она является частью GNU Coreutils, использование expr в сценарии не влияет на переносимость сценария.

Арифметические операции, поддерживаемые expr, - это сложение (+), вычитание (-), умножение (*), деление (/) и модуляция (%). Оператор умножения должен быть экранирован символом '\', так как '*' имеет встроенное значение всех файлов в текущем каталоге.

Использование команды bc (для вычисления с плавающей запятой)

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

Чтобы передать bc числа с плавающей запятой, необходимо использовать echo.

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

Результат работы сценарий

Понравилась статья? Поделиться с друзьями:
Добавить комментарий