bash 中的条件浮动

问题描述 投票:0回答:7

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

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

但我收到错误:

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

出了什么问题?

谢谢

bash
7个回答
9
投票

使用BC:

float1='0.43255'
float2='0.801222'

if (( $(bc <<< "$float1 > $float2") )); then
then
   echo "${float1} > ${float2}"
else
   echo "${float1} <= ${float2}"
fi

地点:

  • bc
    是一个计算给定表达式的程序,就像计算器
  • >
    是 bc 能够理解的表达式语法中的一个运算符,它将返回 0 表示 false,1 表示 true。
  • <<<
    是一个“here string”(“here doc”的变体),它将后续字符串输入到 bc 的标准输入中。
  • $( ... )
    执行 bc 命令,用生成的 stdout 替换该表达式,即 0 或 1。
  • (( ... ))
    根据 Bash 算术规则计算表达式,退出值取决于值:0 导致 1(假)退出值,非零值导致 0(真)退出值。
  • if ...; then
    使用 true (0) 或 false (非零) 退出值做明显的事情。

5
投票

使用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

3
投票

使用 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

2
投票

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


1
投票

抱歉死了,但是看着@jonretting已经很晚的答案,我认为使用

bc
可能是简洁的最佳选择,尽管这并不能解决
a
b
为空或未定义的问题:

 ( (( $(bc <<< "$a > $b") == 1 )) && echo "a is greater than b") || echo "a is smaller than b"

----------
在脚本中使用

printf "%s\n" [string_to_print]
而不是
echo [string_to_print]


0
投票

我会使用 awk 来实现:

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

-1
投票

最简单的解决方案是这样的:

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,您可以从此处下载):

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
© www.soinside.com 2019 - 2024. All rights reserved.