我是 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 变量能够存储该值,但我无法比较它。请任何人都可以帮助我。
答案 0 :(得分:2)
您可以将:if (($size1 > 7.50 | bc))
更改为:
if (( $(echo "$size1 > 7.50" | bc) ))
$(...)
使命令 echo "$size1 > 7.50" | bc
被执行。这会产生 0
或 1
。
答案 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