Гид по технологиям

Как использовать bc для дробной арифметики в Bash

7 min read Linux Обновлено 15 Dec 2025
bc в Bash: дробная арифметика и лучшие практики
bc в Bash: дробная арифметика и лучшие практики

Терминал Linux с приглашением командной строки.

Быстрые ссылки

  • Почему Bash поддерживает только целые числа

  • Использование bc в интерактивном режиме

  • Стандартная математическая библиотека

  • Передача входа в bc через командную строку

  • Использование bc в Bash-скриптах

  • Выводы и рекомендации

Резюме

  • Bash в Linux умеет только в целочисленную арифметику и отбрасывает дробную часть результата.
  • Утилита bc обеспечивает вычисления с плавающей точкой и поддерживает произвольную точность вывода.
  • В bc можно задать число знаков после запятой через переменную scale и подключить стандартную математическую библиотеку с помощью ключа -l.

Почему Bash поддерживает только целые числа

Исторически оболочки Unix (включая классическую Bourne shell) изначально реализовывались с минимальным набором возможностей, и арифметика была целочисленной. В Bash, как в большинстве POSIX-совместимых командных оболочек, встроенные арифметические выражения в конструкции $((…)) выполняются в целых числах. Любая дробная часть в результате отбрасывается (усекается), поэтому операции вроде 6/7 вернут 0.

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

Альтернативы, поставляемые в Linux, — это dc (обратная польская запись) и bc. dc интересен как исторический инструмент, но bc более человекочитаем и удобен для скриптов и интерактивной работы.

Проблема: примеры усечения

Попробуем несколько выражений в Bash:

echo $((6 / 3))

Ожидаемо получаем 2. Но если выполнить

echo $((6 / 7))

то результат будет 0 — дробная часть отбрасывается. При делении 16 на 7:

echo $((16 / 7))

мы увидим 2, потому что целая часть равна 2, а дробная отбрасывается.

Вывод: встроенные арифметические операции Bash непригодны для вычислений с плавающей точкой и дробными частями.

Использование bc в интерактивном режиме

Запустить bc можно просто вызовом:

bc

Сообщение приветствия и приглашение bc в интерактивном режиме

bc ожидает ввод и выполняет вычисления построчно. Примеры:

16 * 4

1024 / 32

2^2 * 1024

Три примера вычислений в bc в интерактивном режиме

Клавиши управления: Ctrl+L — очистить экран, Ctrl+D — выход.

Попробуем деление, дающее дробный результат:

22 / 7

По умолчанию bc не показывает десятичные знаки; число Пи усечено до целой части

По умолчанию bc показывает 0 знаков после запятой: значение scale=0, поэтому дробная часть не отображается. Чтобы управлять точностью вывода, используйте переменную scale.

scale=7
22 / 7

Использование scale для задания до 7 десятичных знаков в ответе

Переменная scale остаётся в сессии до изменения. Она задаёт максимальное число знаков после запятой: bc выводит ровно столько знаков, сколько требуется (без добавления лишних нулей в конце).

scale=10
0.300003 * 0.5

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

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

25 * 6; 12.5 + 45.001; 3 + 5 + 7 + 9

Несколько вычислений на одной строке, разделённых точкой с запятой

Включать присвоение scale в ту же строку тоже можно:

scale=8; 22 / 7; scale=3; 0.3 * 0.071

Изменение scale для каждого вычисления даже на одной строке

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

Стандартная математическая библиотека

Ключ -l (маленькая латинская L) загружает стандартную математическую библиотеку и при этом по умолчанию устанавливает scale в 20.

bc -l
22 / 7

bc запущенный с опцией -l, показывающий Пи с 20 десятичными знаками

Доступные функции из библиотеки:

  • s(x): синус x (x в радианах)
  • c(x): косинус x (в радианах)
  • a(x): арктангенс x
  • l(x): натуральный логарифм x
  • e(x): экспонента e^x
  • j(n,x): функция Бесселя целого порядка n от x

Примеры использования:

s(1.1)

c(.891207)

a(.628473)

Вычисление синуса, косинуса и арктангенса в bc в интерактивном режиме

Передача входа в bc через командную строку

Для автоматизации удобно передавать выражения в bc через перенаправление (here-string) или конвейер (pipe).

Here-string:

bc <<< 22/7
bc -l <<< 22/7

Pipe с echo:

echo 22/7 | bc
echo 22/7 | bc -l

Использование echo для передачи данных в bc и bc -l

Если выражение содержит пробелы или несколько команд, заключите его в кавычки:

echo "22 / 7" | bc -l
echo "scale=6; 22 / 7" | bc

Совет: при сложных многострочных выражениях удобнее подготовить файл с командами и запустить bc < commands.txt или echo -e “…” | bc.

Использование bc в Bash-скриптах

bc идеально подходит для скриптов, где нужно получить контролируемую точность. Ниже пример скрипта, который вычисляет число π с заданным числом знаков после запятой. Сохраните как pi.sh и сделайте исполняемым.

#!/bin/bash

first_number=22
second_number=7

pi=$(echo "scale=$1; $first_number/$second_number" | bc)

echo "Pi to $1 decimal places is: $pi"

Этот скрипт берет первый позиционный параметр $1 как значение для scale. Не забывайте делать файл исполняемым:

chmod +x pi.sh

Запуск:

./pi.sh 5
./pi.sh 14
./pi.sh 20

Вывод скрипта pi.sh, показывающий Пи с разной точностью

Обратите внимание на безопасность: если scale или выражение задаются из входных данных пользователя, валидируйте их; инъекция произвольного кода в bc возможна, если вы передаёте непроверённые строки.

Важно: echo | bc — простой способ, но для сложных выражений безопаснее использовать here-doc или временный файл.

Дополнительные рекомендации и лучшие практики

  • По умолчанию scale=0; -l устанавливает scale=20.
  • Для высокоточных вычислений выбирайте достаточный scale заранее — операции могут замедляться при большой точности.
  • Проверяйте входные данные на предмет недопустимых символов, если они идут от пользователей.
  • Для экспоненциально больших или маленьких чисел bc не поддерживает экспоненциальную нотацию (1e-6) напрямую; используйте функции e(x) или преобразуйте вручную.

Важно: bc — это интерпретатор чисел с произвольной точностью, но не CAS (система символьной алгебры). Он хорош для численных вычислений, но не для аналитического интегрирования/дифференцирования.

Когда bc может не подойти (примеры)

  • Очень большие требования к производительности и миллионы операций — bc будет медленнее специализированных библиотек на C/Python.
  • Нужна обработка комплексных чисел — bc не поддерживает их.
  • Требуется научная экспоненциальная нотация (1.23e-4) в вводе/выводе — bc ожидает десятичную форму и некоторые операции требуют обходных путей.

Альтернативные подходы

  • awk: поддерживает числа с плавающей точкой (обычно двойной точности) и удобен для работы с потоками текста.
  • Python: полный язык с библиотеками decimal для произвольной точности и большим набором математических функций.
  • dc: обратная польская нотация, минималистичен и быстрый в определённых сценариях.
  • printf в Bash: для простых вычислений с плавающей точкой в ограниченной точности можно использовать printf “%.6f” $(echo “…” | bc -l) или встроенные трюки с awk/expr.

Шпаргалка (cheat sheet)

  • Запустить интерактивно: bc
  • С библиотекой: bc -l
  • Установить точность: scale=10
  • Передать выражение: echo “scale=6; 22 / 7” | bc
  • Here-string: bc <<< “22/7”
  • Примеры функций: s(x), c(x), a(x), l(x), e(x), j(n,x)

Простая методология для миграции скриптов с целой арифметики на дробную

  1. Найдите арифметические выражения, использующие $((…)).
  2. Оцените, нужны ли дробные результаты. Если да — идентифицируйте ожидаемую точность.
  3. Замените вычисления на вызовы bc (echo “scale=…; expr” | bc) или используйте awk/Python при более сложных требованиях.
  4. Добавьте валидацию входных данных для scale и чисел.
  5. Напишите тесты для ключевых случаев (см. раздел «Критерии приёмки»).

Роли и чек-листы

Разработчик:

  • Проверить, какие выражения требуют дробных значений.
  • Определить необходимую точность (scale).
  • Реализовать вычисления через bc/awk/Python и добавить тесты.

Системный администратор:

  • Убедиться, что bc доступен в целевых системах (обычно входит в базовый набор пакетов).
  • Проверить совместимость версии bc при переносе между дистрибутивами.

DevOps/инженер по CI:

  • Добавить тесты на CI, которые выполняют скрипты с несколькими значениями scale.
  • Контролировать производительность при массовых запусках.

Критерии приёмки

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

Тесты и примеры приёмки

  1. Ввод: scale=5; 22/7 → ожидаемый вывод: приближённое значение Пи до 5 знаков.
  2. Ввод: scale=0; 6/7 → ожидаемый вывод: 0.
  3. Ввод: scale=10; 0.0001 * 0.0002 → ожидаемый вывод: корректное малое число, не округлённое до 0.
  4. Ввод нечислового параметра в scale → скрипт валидирует и возвращает код ошибки.

Умственные модели и эвристики

  • scale — это максимум знаков после запятой, а не обязательное количество. bc не дополняет ответ нулями справа.
  • Подход «показать больше, чем нужно» безопаснее: при сомнении задавайте больший scale и в конце форматируйте вывод.
  • bc хорош для простых численных задач и автоматизации, Python/NumPy — для научных вычислений и массивов.

Короткий словарь терминов

  • scale: число знаков после десятичной точки, используемое bc.
  • -l: опция bc для загрузки стандартной математической библиотеки.
  • here-string: конструкция Bash <<< для передачи строки в stdin команды.

Сводные выводы

  • Bash по умолчанию работает с целыми числами; для дробных вычислений используйте bc или альтернативы.
  • bc предоставляет гибкость по точности и набор математических функций через -l.
  • Для безопасных и масштабируемых решений в скриптах валидируйте ввод и выбирайте инструмент по потребностям: bc для простых чисел с произвольной точностью, Python/awk — для более сложной логики.

Краткое напоминание: echo | bc — удобно и быстро, но при сложных сценариях и приёмках стоит переходить на here-doc, временные файлы или полноценный язык, чтобы улучшить читаемость и безопасность.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро