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
我有一个 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