Bash 如何在float上使用expr?

Bash 如何在float上使用expr?,bash,floating-point,rounding,fixed-point,Bash,Floating Point,Rounding,Fixed Point,我知道这是个很愚蠢的问题,但我不知道如何在bash中做到这一点: 20 / 30 * 100 它应该是66.67,但是expr说的是0,因为它不支持浮点。 Linux中的哪个命令可以替换expr并执行此操作?bc将为您执行此操作,但顺序很重要 > echo "scale = 2; 20 * 100 / 30" | bc 66.66 > echo "scale = 2; 20 / 30 * 100" | bc 66.00 或者,针对您的具体情况: > export ach_g

我知道这是个很愚蠢的问题,但我不知道如何在bash中做到这一点:

20 / 30 * 100
它应该是
66.67
,但是expr说的是
0
,因为它不支持浮点。
Linux中的哪个命令可以替换expr并执行此操作?

bc
将为您执行此操作,但顺序很重要

> echo "scale = 2; 20 * 100 / 30" | bc
66.66
> echo "scale = 2; 20 / 30 * 100" | bc
66.00
或者,针对您的具体情况:

> export ach_gs=2
> export ach_gs_max=3
> x=$(echo "scale = 2; $ach_gs * 100 / $ach_gs_max" | bc)
> echo $x
66.66
无论您选择哪种方法,都可以将其作为一种功能,让您的生活更轻松:

#!/bin/bash
function pct () {
    echo "scale = $3; $1 * 100 / $2" | bc
}

x=$(pct 2 3 2) ; echo $x # gives 66.66
x=$(pct 1 6 0) ; echo $x # gives 16

如bash手册页中所述:

shell允许在某些情况下对算术表达式求值……求值是在固定宽度的整数中进行的,不检查溢出情况,但被0除会被捕获并标记为错误。 您可以提前乘以100以获得更好的部分结果:

let j=20*100/30
echo $j
66

或者是10的更高倍数,想象一下小数点所在的位置:

let j=20*10000/30
echo $j
66666

用awk就行了

# awk 'BEGIN{print 20 / 30 * 100}'
66.6667
将其保存到变量

# result=$(awk 'BEGIN{print 20 / 30 * 100}')
# echo $result
66.6667
我通常使用perl:

perl -e 'print 10 / 3'

这是paxdiablo对答案的简化。l将刻度(小数点后的位数)设置为20。它还加载一个包含trig函数和其他内容的数学库

另一个显而易见的选择:

python-c“打印(20/30*100)”

假设您使用的是Python 3。否则,请使用
python3

,但我想在脚本中这样做,全文是:$ach\u gs/$ach\u gs\u max*100@maxorq:您可能会注意到,在其他人给出的所有示例中,乘法都是先进行的。这是一个科学计算的东西——因为我们知道小数点左边的数字比右边的数字多,所以乘法首先要减少由于四舍五入造成的精度损失。对不起,我错了,我错了!对于数学操作,尝试使用bc或awk,而不是bash或exprIt,如果发布实际使用的命令行,可能会有所帮助。(我猜你使用的零比我多。)我在发布之前执行了上面的命令,并得到了给出的结果。请先试试。嗯,奇怪,我不记得最初在那里放了空格。无论如何,尝试删除空格并重复。我编辑了我的帖子,删除了有问题的空白;bash“let”返回整数,HidekiAI,这就是为什么我说“想象小数点所在的位置”。返回的结果66666表示实际值66666*10^-3。这一定是一个非常基本的perl问题,但此命令在我的系统上只显示一个空行
perl-e'打印“hello world”
也不起作用。但是,
perl-e'print“hello world\n”
确实可以正常工作。恐怕我帮不了忙。我所能建议的就是在表达式的末尾添加“\n”:
perl-e'print 10/3,“\n”
谢谢,这个解决方法很有效。(您的命令在另一个linux环境中“按原样”工作)对于我们当中的Pythonistas:
python-c“print 10.0/3.0”
这个答案非常尴尬。
> echo "20 / 30 * 100" | bc -l
66.66666666666666666600