简体   繁体   English

shell 中的浮点比较

[英]Floating point comparison in shell

Can you please suggest to me the syntax for doing floating point comparison in a Bash script?您能否向我建议在 Bash 脚本中进行浮点比较的语法? I would ideally like to use it as part of an if statement.理想情况下,我希望将其用作if语句的一部分。 Here is a small code snippet:这是一个小代码片段:

key1="12.3"
result="12.2"

if (( $result <= $key1 ))
then
    # some code here
fi

bc is your friend: bc是你的朋友:

key1="12.3"
result="12.2"
if [ $(bc <<< "$result <= $key1") -eq 1 ]
    then
    # some code here
fi

Note the somewhat obscure here string ( <<< ) notation, as a nice alternative to echo "$result <= $key1" | bc请注意这里有点晦涩的字符串( <<< ) 表示法,它是echo "$result <= $key1" | bc一个很好的替代方法echo "$result <= $key1" | bc echo "$result <= $key1" | bc . echo "$result <= $key1" | bc

Also, the un-bash-like bc prints 1 for true and 0 for false .此外,类似 un-bash 的bctrue打印1 ,为false打印0

bash doesn't do floats, use awk bash 不做浮动,使用 awk

key1=12.3
result=12.5
var=$(awk 'BEGIN{ print "'$key1'"<"'$result'" }')    
# or var=$(awk -v key=$key1 -v result=$result 'BEGIN{print result<key?1:0}')
# or var=$(awk 'BEGIN{print "'$result'"<"'$key1'"?1:0}')
# or 
if [ "$var" -eq 1 ];then
  echo "do something"
else
  echo "result more than key"
fi

there are other shells that can do floats, like zsh or ksh, you might like to try using them as well还有其他 shell 可以做浮动,比如 zsh 或 ksh,你也可以尝试使用它们

使用 bc 的另一个简单明了的方法是:

if ((`bc <<< "10.21>12.22"`)); then echo "true"; else echo "false"; fi

Using the exit() function of awk makes it almost readable.使用awkexit()函数使其几乎可读。

key1=12.3
result=12.5

# the ! awk is because the logic in boolean tests 
# is the opposite of the one in shell exit code tests
if ! awk "{ exit ($result <= $key1) }" < /dev/null
then
        # some code here
fi

Note that there is not need to reuse the [ operator as if already uses the exit value.请注意,无需重复使用[运算符,就if已经使用了退出值一样。

### The funny thing about bash is this:
> AA=10.3
> BB=10.4
### It needs `$` for compare
> [[ $AA > $BB ]] && echo Hello
> [[ $AA < $BB ]] && echo Hello
Hello

Yeah, I know it's cheating but it works.是的,我知道这是作弊,但它有效。 And scientific notation does not work here.科学记数法在这里不起作用。

yu can use this awk comparison inside a if clause, it will print 1 (true) if the condition is true else 0 (false), and those values will be interpreted as boolean vals by the if你可以在 if 子句中使用这个 awk 比较,如果条件为真,它将打印 1(真)否则 0(假),并且这些值将被 if 解释为布尔值

if (( $(awk 'BEGIN {print ("'$result'" <= "'$key1'")}') )); then
    echo "true"
else
    echo "false"
fi

I was using bc until now, I found in some distros there was not bc installed, and I did not want to go through sudo apt install bc but python was there.直到现在我一直在使用 bc,我发现在一些发行版中没有安装 bc,我不想通过sudo apt install bc但 python 在那里。 Using python:使用蟒蛇:

  if python -c "import sys; sys.exit(0 if float($float_1) > float($float_2) else 1)"; 
    then
    echo "true"
         else
           echo "false"
  fi

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM