代码之家  ›  专栏  ›  技术社区  ›  vato

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

  •  2
  • vato  · 技术社区  · 8 年前

    我想测试变量 $test 介于 -0.9 0.9 . 以下代码适用于数字,但如果 $test 是一个小写字母,它表示一个介于 -0.9 0.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
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   John1024 David C. Rankin    8 年前

    替换:

    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 仅包含合法的数字字符。

    • &&

      只有在以下情况下,才能继续bc测试 $test 通过了号码检查。

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

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

        2
  •  0
  •   tripleee    8 年前

    重构代码以使用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 !(...) . Awk的处理模型要求您读取输入文件;我们提供 /dev/null ,并将实际逻辑放入 END 块,这样即使没有输入也可以执行。

    这将检查小数点是否从未超过一个,但正则表达式目前无法处理指数表示法。考虑到John1024的答案中的regex,添加对它的支持应该不会太难。

    推荐文章