Bash 脚本:测试浮点数是否在一定范围内,包括负数

Bash script: testing if floating point number is in a certain range including negative numbers

我正在尝试测试变量 $test 是否在 -0.90.9 之间。以下代码适用于数字,但如果 $test 是小写字母,则表示它是 -0.90.9 之间的数字。

是否有更好的方法可以让字母不在范围内?

test=a

if (( $( echo "$test >= -0.9" |bc -l) )) && (( $(echo "$test <= 0.9" |bc -l) )); then
    echo "${test} is between -0.9 and 0.9"
else
    echo "${test} is NOT between -0.9 and 0.9"
fi

替换:

if (( $( echo "$test >= -0.9" |bc -l) )) && (( $(echo "$test <= 0.9" |bc -l) )); then

使用(假设是 GNU 或其他增强型 bc):

if [[ "$test" =~ ^[[:digit:].e+-]+$ ]] && echo "$test>-0.9 && $test <=0.9" |bc -l | grep -q 1; then

工作原理

  • [[ "$test" =~ ^[[:digit:].e+-]+$ ]]

    这会检查 $test 是否只包含合法的数字字符。

  • &&

    仅当 $test 通过数字检查时,才继续进行 bc 测试。

  • echo "$test>-0.9 && $test <=0.9" |bc -l | grep -q 1

    这将验证 $test 在您想要的范围内。 grep -q 1 为要使用的 if 语句设置适当的退出代码。

重构代码以使用 Awk 可能更有效,尽管它需要了解一些关于 shell 的晦涩的事情。

if awk -v number="$test" 'END { exit !( \
    number !~ /[^0-9.]/ && number !~ /\..*\./ && \
    number >= -0.9 && number <= 0.9) }' /dev/null
then
    echo "$test is between -0.9 and 0.9"
else
    echo "$test is NOT between -0.9 and 0.9"
fi

if检查的exit code为0则为真,与括号内的真值相反;因此 exit !(...)。 Awk 的处理模型要求您读取输入文件;我们提供 /dev/null,并将实际逻辑放在 END 块中,这样即使没有输入也能执行。

这会检查小数点不会超过一位,但正则表达式目前无法处理指数表示法。鉴于 John1024 的回答中的正则表达式,添加对此的支持应该不会太难。