Иногда мне нужно разделить одно число на другое. Было бы здорово, если бы я мог просто определить функцию bash для этого. До сих пор я вынужден использовать такие выражения, как
echo 'scale=25;65320/670' | bc
но было бы здорово, если бы я мог определить функцию .bashrc, которая выглядела бы как
divide () {
bc -d $1 / $2
}
command-line
function
arithmetic
bashrc
bc
ixtmixilix
источник
источник
ksh
, 93-вариант, поддерживает здесь-строки.Bash может в какой-то степени сам заниматься математикой. Это не полезно для точности, хотя, поскольку это округляет.
Но вы совершенно правы - функция bash будет простым ярлыком, и ваш пример в основном работает.
Добавьте это в свой .bashrc, и тогда вы сможете:
источник
echo $((10 / 5))
не нуждается в цитате.echo $((6383/7671))
даст вам ноль. Вы должны четко указать числа с плавающей запятой:echo $((6383.0/7671.0))
Вы, вероятно, знаете, что встроенный в Bash expr, как в
который ограничен целыми числами и нуждается в пробелах между аргументами.
Что мешает вам определить функцию в соответствии с выражением эха, которое вы уже используете? Т.е.
источник
Не совсем ответ на этот точный вопрос, но это может быть полезно знать. Используйте
zsh
;-)источник
expr
встроеннуюЕсли вы
calc
установили в своей системе и вам не нравится округление, вы можете:источник
apcalc
(Arbitary Precision) ... Двоичный файл называетсяcalc
calc
.Грязный хак для малых значений и ограниченной точности без использования bc был бы, чтобы умножить знаменатель перед делением, чтобы получить точный результат.
Пример без точности:
и с точностью до 2 цифр: умножьте на 100 и сдвиньте десятичную точку на 2 шага влево:
Это полезно только в том случае, если диапазон чисел известен ранее, а точность всегда одинакова. Избегать вызова bc и вызывать sed кажется не очень разумным.
Обратите внимание, что умножение значений может привести к ошибкам переполнения, но не очень рано:
источник
$[expression]
вместо этогоThe old format $[expression] is deprecated and will be removed in upcoming versions of bash.
Вместо использования bc, вы можете использовать awk:
источник
источник