比较 float 和 bc 时出现语法错误

比较 float 和 bc 时出现语法错误

我正在尝试使用 的比较运算符bc,但收到“第 1 行 stdin 上的语法错误”错误。我需要在 korn 脚本中使用比较功能,因为 korn 不能很好地处理浮点。用法示例如下:

echo "scale=2; 3.2 > 3" | bc

答案1

你所做的应该有效;它符合bcPOSIX 的规定。然而,bc 是一个相对较少使用的工具,并且某些实现可能存在错误。如果您没有使用任何+-*/比 和 比较更高级的数学函数,您可以使用awk;甚至 A、W 和 K 的原始实现也支持浮点运算。

echo 3.2 | awk '{exit !($0 > 3)}'

答案2

expr 可以处理这样的浮点比较,很好。

ksh -c '(( $(expr 3.2 \> 3) == 1 )) && echo 1 || echo 0'

或者在脚本中使用它,例如:

#!/usr/bin/ksh

if [ $(expr $1 \> $2) == 1 ]; then
    echo "greater"
else 
    echo "lesser"  
fi

您可能会发现 expr 更可移植,因为您上面使用的 bc 行适用于 Linux,但不适用于Solaris。使用 expr 在这两个操作系统上的工作原理应该是相同的。

答案3

如果可用,请尝试dc:

echo "2 k 3.2 3 [1p] sa <a" | dc

请注意,上面还将使用 2 个小数精度,并且如果第一个数字(上例中的 3.2)大于第二个数字(上面的 3),则输出 1。但否则将不会输出任何内容。

dcbc的兄弟,在GNU文档中用同样的“任意精度计算器”字样描述。在某些发行版中,它们是在同一包中提供的,而在其他发行版中,它们是单独打包的。

相关内容