如何比较shell脚本中的浮动值?

时间:2021-05-15 07:00:54

标签: shell if-statement

我是 shell 脚本的初学者。我有一个十进制值,我想在 if 语句中比较它。我是这样尝试的

size1=`${PATH_TO_CLIENT}sqlplus $IMPUSER/$IMPPWD@$ENDPOINT<< EOF | sed -n '/^\s*SIZE_GB$/{n;n;n;p}'
select owner, sum(bytes)/1024/1024/1024 Size_GB from dba_segments where owner = 'XXXXXX' group by owner;
exit;
EOF`
echo "Total data is = ${size1}"

if (($size1 > 7.50 | bc))
then
  echo '### THE DATA SIZE IS GREATER THAN 7.5 GB ###'
  echo 'Total data is ${size1}'
  exit 1
else
  echo 'Total data is {$size1}'
  echo '### THE DATA SIZE IS OKAY ###'
fi

我得到的输出是

Total data is = 11.2345
./testDelete.sh: line 65: ((: 11.2345 > 7.50 | bc: syntax error: invalid arithmetic operator (error token is ".2345 > 7.50 | bc")
Total data is {$size1}
### THE DATA SIZE IS OKAY ###

所以 size1 变量能够存储该值,但我无法比较它。请任何人都可以帮助我。

4 个答案:

答案 0 :(得分:2)

您可以将:if (($size1 > 7.50 | bc)) 更改为:

if (( $(echo "$size1 > 7.50" | bc) ))

$(...) 使命令 echo "$size1 > 7.50" | bc 被执行。这会产生 01

答案 1 :(得分:2)

我喜欢做小的不安全 awk 包装器:

float_cmp() {
    awk "BEGIN{exit(!( $* ))}" <&-
}

if float_cmp "$size1 > 7.50"; then

答案 2 :(得分:1)

不久前,我遇到了同样的问题。我做了一些搜索,最终得到了这个函数:

function compare_floats(){
    ## https://stackoverflow.com/questions/8654051/how-to-compare-two-floating-point-numbers-in-bash
    ## usage: is_smaller="$(compare_floats "$num1" "<" "$num2")"  ## returns true or false

    local float1="$1"
    local oper="$2"
    local float2="$3"

    ## compare
    case "$oper" in
         "<" ) [ $(awk '{printf($1 <  $2) ? 1 : 0}' <<< "$float1 $float2") -eq 1 ] && local result="true" || local result="false" ;;
         "=" ) [ $(awk '{printf($1 == $2) ? 1 : 0}' <<< "$float1 $float2") -eq 1 ] && local result="true" || local result="false" ;;
         ">" ) [ $(awk '{printf($1 >  $2) ? 1 : 0}' <<< "$float1 $float2") -eq 1 ] && local result="true" || local result="false" ;;
    esac

    echo "$result" ;}


condition="$(compare_floats 41.4 "<" 19.2)"
[ "$condition" == "true" ] && <do_this> || <do_that>

答案 3 :(得分:1)

纯壳方案

$ if [ 7 \> 7.5 ]; then echo 'Y'; else echo 'N'; fi
N
$ if [ 7.4 \> 7.5 ]; then echo 'Y'; else echo 'N'; fi
N
$ if [ 7.5 \> 7 ]; then echo 'Y'; else echo 'N'; fi
Y
$ if [ 7.5 \> 7.4 ]; then echo 'Y'; else echo 'N'; fi
Y
$ if [ 7 \< 7.5 ]; then echo 'Y'; else echo 'N'; fi
Y
$ if [ 7.4 \< 7.5 ]; then echo 'Y'; else echo 'N'; fi
Y
$ if [ 7.5 \< 7 ]; then echo 'Y'; else echo 'N'; fi
N
$ if [ 7.5 \< 7.4 ]; then echo 'Y'; else echo 'N'; fi
N
$ if [ 7 = 7.5 ]; then echo 'Y'; else echo 'N'; fi
N
$ if [ 7.4 = 7.5 ]; then echo 'Y'; else echo 'N'; fi
N
$ if [ 7.5 = 7.5 ]; then echo 'Y'; else echo 'N'; fi
Y