Bash 比较整数和小数的错误

Bash Comparing Whole number to Decimal Errors

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

VAR1=1

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

VAR2=1.5

当我尝试时:

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

我收到 syntax error: invalid arithmetic operator

问题是,当我尝试 >= 字符串比较时,不管逻辑上是否正确,结果始终为 false。

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

代码块

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;

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

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

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

Bash不支持浮点数。

尝试 bc:

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

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

对于 --mathlib-l 开关是 shorthand,在处理浮点数时需要

如果你想要一个完整的if声明,你也可以这样做:

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 中结合了这两个条件,以免您调用该工具两次。我还将那部分包装在算术上下文中,并对其余部分使用扩展测试 [[

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