有时我需要将一个数除以另一个。如果我可以为此定义一个bash函数,那就太好了。到目前为止,我被迫使用类似
echo 'scale=25;65320/670' | bc
但是如果我可以定义一个看起来像
divide () {
bc -d $1 / $2
}
有时我需要将一个数除以另一个。如果我可以为此定义一个bash函数,那就太好了。到目前为止,我被迫使用类似
echo 'scale=25;65320/670' | bc
但是如果我可以定义一个看起来像
divide () {
bc -d $1 / $2
}
Answers:
我有一个方便的bash函数,名为calc
:
calc () {
bc -l <<< "$@"
}
用法示例:
$ calc 65320/670
97.49253731343283582089
$ calc 65320*670
43764400
您可以更改此设置以适合自己。例如:
divide() {
bc -l <<< "$1/$2"
}
注意:这 <<<
是一个字符串,被输入到的标准输入中bc
。您无需调用echo
。
ksh
93变量@TatjanaHeuser 支持here字符串。
Bash可以在一定程度上进行数学运算。但是,由于四舍五入,它对于准确性没有用。
[user]$ echo $(( 10/5 ))
2
但是您完全正确-bash函数将是一个简单的快捷方式,您的示例基本上可以正常工作。
divide() {
echo "scale=25;$1/$2" | bc
}
将其扔到.bashrc中,然后可以:
[user]$ divide 10 5
2.0000000000000000000000000
echo $((10 / 5))
无需报价。
echo $((6383/7671))
会给你零。您需要明确说明浮点数:echo $((6383.0/7671.0))
您可能知道bash内置的“ expr”
$ expr 60 / 5
12
限于整数,并且参数之间需要空格。
是什么让您无法按照已经在使用的echo表达式定义函数?即
divide () {
echo $1/$2 | bc
}
并不是对这个精确问题的真正答案,但是知道这可能是个好消息。使用zsh
;-)
% echo $((65320./670))
97.492537313432834
expr
内置函数,所以无论如何都是很好的答案:)
如果您已calc
安装在系统上并且不喜欢四舍五入,则可以:
div() { calc "$1 / $2"; }
apcalc
(Arbitary Precision)...二进制程序称为calc
calc
。
在不使用bc的情况下,针对小数值和有限精度的肮脏破解将是在除法之前将提名者相乘,从而获得准确的结果。
不精确的示例:
echo $((13/7))
1
精度为2位:乘以100,然后将小数点向左移动2步:
echo $((100*13/7)) | sed 's/..$/.&/'
1.85
echo $((100*13/7))%
185%
仅在数字范围以前已知且精度始终相同的情况下才有用。避免调用bc并调用sed似乎不是很合理。
请注意,将值相乘可能会导致溢出错误,但不是很早:
echo $((1000000000*12345678901))
-6101065172709551616
$[expression]
代替
The old format $[expression] is deprecated and will be removed in upcoming versions of bash.