使用bash函数在命令行上执行简单的数学运算:$ 1除以$ 2(也许使用bc)


33

有时我需要将一个数除以另一个。如果我可以为此定义一个bash函数,那就太好了。到目前为止,我被迫使用类似

echo 'scale=25;65320/670' | bc

但是如果我可以定义一个看起来像

divide () {
  bc -d $1 / $2
}

Answers:


45

我有一个方便的bash函数,名为calc

calc () {
    bc -l <<< "$@"
}

用法示例:

$ calc 65320/670
97.49253731343283582089

$ calc 65320*670
43764400

您可以更改此设置以适合自己。例如:

divide() {
    bc -l <<< "$1/$2"
}

注意:这 <<<是一个字符串,被输入到的标准输入中bc。您无需调用echo


3
我同意在没有附加回声的情况下看起来会更好,但是由于它是内置的shell,因此几乎没有附加成本。使我无法在shell函数中使用'<<<'的原因是它对bash的限制,而额外的回声允许在原始bourne shell或ksh中使用它而无需更改。
Tatjana Heuser

ksh93变量@TatjanaHeuser 支持here字符串。
Kusalananda

要分配给变量,我这样做:foo = $(bc -l <​​<<“((2 * 5)+ 5”)
thebiggestlebowski

20

Bash可以在一定程度上进行数学运算。但是,由于四舍五入,它对于准确性没有用。

[user]$ echo $(( 10/5 ))
2

但是您完全正确-bash函数将是一个简单的快捷方式,您的示例基本上可以正常工作。

divide() {
  echo "scale=25;$1/$2" | bc
}

将其扔到.bashrc中,然后可以:

[user]$ divide 10 5
2.0000000000000000000000000

1
echo $((10 / 5))无需报价。
用户未知

1
烦人的事: echo $((6383/7671)) 会给你零。您需要明确说明浮点数:echo $((6383.0/7671.0))
Sridhar Sarnobat,2016年

9

您可能知道bash内置的“ expr”

$ expr 60 / 5
12

限于整数,并且参数之间需要空格。

是什么让您无法按照已经在使用的echo表达式定义函数?即

 divide () {
   echo $1/$2 | bc
 }

1
只是无知。我没意识到我可以那样做……
ixtmixilix

7

并不是对这个精确问题的真正答案,但是知道这可能是个好消息。使用zsh;-)

% echo $((65320./670))
97.492537313432834

我实际上是在寻找这个问题,因为我改用zsh并且无法使用bash的expr内置函数,所以无论如何都是很好的答案:)
SteenSchütt17年

2

如果您已calc安装在系统上并且不喜欢四舍五入,则可以:

div() { calc "$1 / $2"; }

嗯...找不到用于'calc'的任何debian软件包
ixtmixilix 2012年

该程序包称为apcalc (Arbitary Precision)...二进制程序称为calc
Peter.O,2012年

@ Peter.O好吧,在Arch Linux仓库中,它叫做calc

2

在不使用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]代替
laebshade 2012年

3
@laebshade:我可以证明你错了,事实恰恰相反。以下是bash手册的引文:The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
未知用户

还在这里,  这里  和  这里讨论。
G-Man说“恢复莫妮卡”

0

除了使用bc之外,您还可以使用awk:

div() { awk -v p=$1 -v q=$2 'BEGIN{print p/q}'; }

-4
echo Division
efgh=$num1/$num2
remainder=$num1%num2
echo $num1 "/" $num2 "=" $efgh.$remainder
echo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.