4

我必须在 shell 脚本中进行划分,最好的方法是:

result1=`echo "scale=3; ($var1 / $total) * 100"| bc -l`
result2=`echo "scale=3; ($var2 / $total) * 100"| bc -l`

但我想比较和的$result1$result2

使用if test $result1 -lt $result2if [ $result1 -gt $result2 ]没有工作:(

知道怎么做吗?

4

3 回答 3

6

您可以使用以下方法比较浮点数expr(1)

: nr@yorkie 3724 ; expr 3.1 '<' 3.3
1
: nr@yorkie 3725 ; expr 3.1 '<' 3.09
0

您还可以bc进行比较和计算:

if [ "$(echo $result1 '<' $result2 | bc -l)" -eq 1 ];then ... fi

$(($result1 < $result2))最后,ksh93 可以对浮点数进行算术评估,尽管 bash 不能。

于 2010-05-04T23:42:33.843 回答
0

请注意,在处理浮点数时您必须小心一点,如果您正在测试相等性,您真的想确定一些精度,然后使用它进行比较。就像是:

if (abs(x1-x2) < 0.0001) then equal # pseudo-code

原因是计算机处理的是精度有限的二进制分数,而不是真正的数学实数。使用 scale=3 限制 bc 中的精度会产生这种效果。

我还建议不要尝试在 shell 脚本中执行此操作。并不是你不能这样做,而是你必须分叉出许多小子命令来完成棘手的工作,而且执行起来很慢,而且通常写起来很痛苦——你大部分时间都在尝试获取 shell做你想做的事,而不是写你真正想要的代码。改为使用更复杂的脚本语言;我选择的语言是 perl,但还有其他语言。像这样...

echo $var1 $var2 $total | perl -ne 'my ($var1, $var2, $tot) = split /\s+/; if ($var1/$tot == $var2/$tot) { print "equal\n"; }'

另请注意,您要除以相同的值(您的问题中的 $total),因此可以针对分子(var1 和 var2)进行整个比较,前提是 $total 为正

于 2010-05-05T00:31:39.093 回答
0

发布一个新的答案,因为我还不能评论......

@Norman Ramsey 的回答不太准确:

  • expr将执行整数或字符串比较,而不是浮点比较。
    这是手册页的内容:

    expr1 {=, >, >=, <, <=, !=} expr2

    如果两个参数都是整数,则返回整数比较的结果;否则,使用特定于语言环境的排序规则返回字符串比较的结果。

    (只是试着expr 8.9 '<' 100它应该在的地方1)。

  • bc效果很好,但并不总是安装。


所以另一种选择是使用perl -e

  • perl -e 'print expression'1如果表达式为真,则打印,否则不打印(空字符串)。

    例如perl -e 'print 8.9 < 10'- 打印“1”,而perl -e 'print 2>4'什么也不打印。

  • 并且在if声明中使用时:

    if [ $(perl -e "print $result1 < $result2") ];then ... fi

于 2016-03-29T19:43:40.913 回答