【问题标题】:Float conditional in bash在bash中浮动条件
【发布时间】:2018-03-14 12:27:31
【问题描述】:

在 bash 中,我需要比较两个浮点数,一个是我在脚本中定义的,另一个是作为参数读取的,为此我这样做:

   if [[ $aff -gt 0 ]]
    then
            a=b
            echo "xxx "$aff
            #echo $CX $CY $CZ $aff
    fi

但我得到了错误:

[[: -309.585300:语法错误:算术运算符无效(错误标记为“.585300”)

怎么了?

谢谢

【问题讨论】:

标签: bash


【解决方案1】:

使用 bc 代替 awk:

float1='0.43255'
float2='0.801222'

if [[ $(echo "if (${float1} > ${float2}) 1 else 0" | bc) -eq 1 ]]; then
   echo "${float1} > ${float2}"
else
   echo "${float1} <= ${float2}"
fi

【讨论】:

    【解决方案2】:

    使用 awk

    #!/bin/bash
    num1=0.3
    num2=0.2
    if [ -n "$num1" -a -n "$num2" ];then
      result=$(awk -vn1="$num1" -vn2="$num2" 'BEGIN{print (n1>n2)?1:0 }')
      echo $result
      if [ "$result" -eq 1 ];then
       echo "$num1 greater than $num2"
      fi
    fi
    

    【讨论】:

    • 确实很好。最后一条评论, num1 是从某个文件中读取的,在某些情况下它是空的,因此比较给出了奇怪的结果。如何在后面检查“如果 num1 为空则 num1 = 0”?
    • 使用-n 测试非空字符串。请参阅man test 了解更多信息
    【解决方案3】:

    test(通常链接为[)和bash-builtin 等效项均仅支持整数。

    【讨论】:

      【解决方案4】:

      使用 bc 检查数学

      a="1.21231"
      b="2.22454" 
      c=$(echo "$a < $b" | bc)
      if [ $c = '1' ]; then 
          echo 'a is smaller than b'
      else 
          echo 'a is larger than b'
      fi
      

      【讨论】:

        【解决方案5】:

        我会为此使用 awk:

        e=2.718281828459045
        pi=3.141592653589793
        if [ "yes" = "$(echo | awk "($e <= $pi) { print \"yes\"; }")" ]; then
            echo "lessthanorequal"
        else
            echo "larger"
        fi
        

        【讨论】:

          【解决方案6】:

          最简单的解决办法是这样的:

          f1=0.45
          f2=0.33
          if [[ $f1 > $f2 ]] ; then echo "f1 is greater then f2"; fi
          

          哪个(在 OSX 上)输出:

          f1 is greater then f2
          

          这是另一个结合浮点和整数运算的示例(您需要很棒的小 perl 脚本 calc.pl,您可以从 here 下载):

          dateDiff=1.9864
          nObs=3
          i=1
          while [[ $dateDiff > 0 ]] &&  [ $i -le $nObs ]
          do
            echo "$dateDiff > 0"
            dateDiff=`calc.pl $dateDiff-0.224`
            i=$((i+1))
          done
          

          哪些输出

          1.9864 > 0
          1.7624 > 0
          1.5384 > 0
          

          【讨论】:

          • 我刚刚意识到 这并不真正起作用,因为 bash 会默默地忽略小数点。它仅适用于比较特殊情况下的浮点数,例如当它们在小数点之前具有相同的位数时。解决方案是仅使用您要比较的浮点数的整数部分(使用 -gt 而不是 > 和 -lt 而不是 作为整数分开。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-31
          • 2012-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多