Shell脚本中的浮点比较

Kir*_*ran 19 unix linux bash shell

你能否告诉我在Bash脚本中进行浮点比较的语法?理想情况下,我喜欢将它作为if陈述的一部分.这是一个小代码片段:

key1="12.3"
result="12.2"

if (( $result <= $key1 ))
then
    # some code here
fi
Run Code Online (Sandbox Code Playgroud)

Che*_*evy 57

bc 是你的朋友:

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

注意这里有点模糊的string(<<<)表示法,作为一个很好的替代echo "$result <= $key1" | bc.

此外,未bash类似的bc版画10.


gho*_*g74 18

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
Run Code Online (Sandbox Code Playgroud)

还有其他可以执行浮动的shell,比如zsh或ksh,你也可以尝试使用它们

  • 这看起来像是一种相当尴尬的方式(没有双关语意). (3认同)
  • 我不是 100% 确定,但 awk 表达式中的双引号导致 awk 表现得很奇怪,因为例如,`awk 'BEGIN{ print "3.05"&gt;="20"}` 返回 1。删除双引号后,它按预期运行。 (2认同)
  • 直到我使用:`print (result &lt; key)` 才对我有用 (2认同)

Aqu*_*wer 6

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

if ((`bc <<< "10.21>12.22"`)); then echo "true"; else echo "false"; fi
Run Code Online (Sandbox Code Playgroud)


Ste*_*epp 5

使用的exit()功能awk使其几乎可读。

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
Run Code Online (Sandbox Code Playgroud)

注意,[由于if已经使用了退出值,因此不需要重用运算符。