检查十进制数是否在 bc 的范围内

检查十进制数是否在 bc 的范围内

我已经写了这个 if ,这显然不起作用,而且我仍然无法克服它:

#LASTEFFECTIVEHASH
if (( $(echo "$LASTEFFECTIVEHASHMINVAL < $LASTEFFECTIVEHASH < $LASTEFFECTIVEHASHMAXVAL" | $BC -l) )); then
                echo "$DATESTAMP - LASTEFFECTIVEHASH=$LASTEFFECTIVEHASH is between $LASTEFFECTIVEHASHMINVAL and $LASTEFFECTIVEHASHMAXVAL"|tee -a $LOGFILE
else
                echo "$DATESTAMP - LASTEFFECTIVEHASH=$LASTEFFECTIVEHASH is not between $LASTEFFECTIVEHASHMINVAL and $LASTEFFECTIVEHASHMAXVAL"|tee -a $MSGFILE $LOGFILE
fi

但是,当值超出范围时,会导致以下结果:

20170810003646 - LASTEFFECTIVEHASH=139.2 is between 104.9 and 136.9

我遵循数学语法:如果 x > 104.9 且 < 136.9,则在数学中写为104.9 < x < 136.9。但我怀疑 bash/bc 的行为与我的数学老师不同。

如果 bc 不会数到 137 就太好了;)

答案1

与 python 不同,bc它不支持链式比较:

a < b < c

要执行这两个比较并要求两者都为 true,请使用逻辑与(需要 GNU bc):

(a < b) && (b < c)

例如:

$ a=104.9; b=136; c=136.9; if echo "($a < $b) && ($b < $c)" | bc -l | grep -q 1; then echo True; else echo False; fi
True
$ a=104.9; b=137; c=136.9; if echo "($a < $b) && ($b < $c)" | bc -l | grep -q 1; then echo True; else echo False; fi
False

POSIX BC

如果你没有 GNU bc,你可以用乘法替换逻辑与:

$ a=104.9; b=136; c=136.9; if echo "($a < $b)*($b < $c)" | bc -l | grep -q 1; then echo True; else echo False; fi
True
$ a=104.9; b=137; c=136.9; if echo "($a < $b)*($b < $c)" | bc -l | grep -q 1; then echo True; else echo False; fi
False

相关内容