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