Bash比较整数到十进制错误

时间:2015-03-26 12:48:12

标签: bash shell sh

我有一个bash脚本,我试图比较一个包含整数的变量

VAR1=1

要比较的实数,可以是小数

VAR2=1.5

当我尝试:

if [[ $VAR1 -ge $VAR2]];

我看到了syntax error: invalid arithmetic operator

问题是,当我尝试>=字符串比较时,结果始终是错误的,无论它是否合乎逻辑。

我的问题是,如何解决此问题并进行算术比较?

代码块

if [ $(bc -l <<<"$CPUUSAGE >= $MAXCPU") || $(bc -l <<<"$FREEMEM <= $MAXMEM") || $NUMHTTPD -ge $MAXHTTPD || $NUMMYSQL -ge $MAXMYSQL || $NUMPROCS -ge $MAXPROCESSES ]];
then    
    SendMessage;
    sync ; echo 3 > /proc/sys/vm/drop_caches;
    echo "Message Sent";
fi;

3 个答案:

答案 0 :(得分:2)

bash不支持浮点运算。您可以使用bc

if  [ $(bc --mathlib <<< "$var1 >= $var2") = "1" ] ; then
    echo "$var2 is greater than or equal to $var2"
fi

请注意,除非您传递--mathlib选项,否则即使bc也不支持浮点运算。

答案 1 :(得分:2)

Bash不支持浮点数。

尝试bc

(( $(bc -l <<<"$v1 >= $v2") )) && echo "v1 is greater than or equal to v2"

我在这里使用了一些bashisms,特别是(( arithmetic context ))<<<作为echo将字符串bc替换为bc的替代方法。 -l的输出将为1或0,具体取决于语句是true还是false。只有在结果为真时才会回显该消息。

--mathlib开关是if的简写,在处理浮点数时需要hek2mgl rightly asserts

如果你想要一个完整的if (( $(bc -l <<<"$v1 >= $v2") )); then echo "v1 is greater than or equal to v2" else echo "v1 is less than v2" fi 声明,你也可以这样做:

if (( $(bc -l <<<"$CPUUSAGE >= $MAXCPU || $FREEMEM <= $MAXMEM") )) || [[ $NUMHTTPD -ge $MAXHTTPD || $NUMMYSQL -ge $MAXMYSQL || $NUMPROCS -ge $MAXPROCESSES ]]; then echo; fi

对于您问题中的示例,您可以使用:

bc

我已将[[中的两个条件合并,以节省您两次调用该工具的时间。我还将该部分包装在算术上下文中,并使用扩展测试{{1}}进行其余部分。

答案 2 :(得分:0)

AWK也可以做到这一点:

#!/bin/sh

VAR1=1
VAR2=1.5

if awk "BEGIN {exit $VAR1 >= $VAR2 ? 0 : 1}"
then 
   echo "$VAR1 is greater than or equal to $VAR2" 
else
   echo "$VAR2 is greater than or equal to $VAR1"
fi