среда, 23 февраля 2011 г.

Сравнение вещественных чисел в bash

Я продолжаю писать инструмент для слежения за самодельным вэб-сервером.
Сегодня наткнулся на новую особенность bash — он не умеет работать с вещественными числами (с плавующей точкой). Например он не может их сравнивать:
if [ 0.1 -gt 0.3 ]

возвращает ошибку «bin/run.bash: строка 44: [: 0.1: ожидается числовое выражение».
Пользователь MoneyCat пишет что лучше для этого использовать операторы <, >, <=, >=:
if [ 0.1 > 0.3 ]

Ошибка хоть и перестала появляться, но зато скрипт начал просто неверно работать.
Как нам дружелюбно напоминает Advanced Bash-Scripting Guide:
Bash does not understand floating point arithmetic. It treats numbers containing a decimal point as strings.
Чтобы обойти это ограничение можно воспользоваться bc:
if [ $(echo "$max < $i" | bc) -eq 1 ]


Теперь мой скрипт так же умеет следить и за загрузкой процессора. Он получает % от используемого моей программой процессорного времени в виде вещественного числа от команды ps:
CPUUSE=$(ps h -p $TARG_PID -o pcpu)

Комментариев нет:

Отправить комментарий