我正在尝试使用 的比较运算符bc
,但收到“第 1 行 stdin 上的语法错误”错误。我需要在 korn 脚本中使用比较功能,因为 korn 不能很好地处理浮点。用法示例如下:
echo "scale=2; 3.2 > 3" | bc
答案1
你所做的应该有效;它符合bc
POSIX 的规定。然而,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。但否则将不会输出任何内容。
dc
是bc
的兄弟,在GNU文档中用同样的“任意精度计算器”字样描述。在某些发行版中,它们是在同一包中提供的,而在其他发行版中,它们是单独打包的。