在shell中无法将浮点数和整数进行比较
已经CPU的使用率是大于5%,且远小于80%的
例如
bash
# 获取CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if [ $cpu_usage -gt "5" ]; then
echo "CPU的使用率是"$cpu_usage
fi
将 -gt 换成 >
此代码会报错
bash
line 4: [: 27.5: integer expression expected
是因为 > 主要用于字符串比较,而 -gt 用于数字比较。
这里比较的是用浮点数和字符串比较,所以报错
改成
bash
# 获取CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if [ $cpu_usage > "5" ]; then
echo "CPU的使用率是"$cpu_usage
fi
bash
# 获取CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if [ $cpu_usage > 5 ]; then
echo "CPU的使用率是"$cpu_usage
fi
CPU的使用率是12.3
CPU的使用率是11.1
浮点类型数值和整数能否有效比对
改成这样不报错了,但是如果进一步测试,发现数值的比对比并不是有效的,本不应该输出的结果,结果输出了,虽然代码没有报错,但是结果是错。
bash
# 获取CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if [ $cpu_usage > "80" ]; then
echo "CPU的使用率是"$cpu_usage
fi
# 获取CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if [ $cpu_usage > 80 ]; then
echo "CPU的使用率是"$cpu_usage
fi
CPU的使用率是15.9
CPU的使用率是11.4
说明浮点类型的数值是无法和整数进行比较的。
将浮点类型转换为字符串数值来比对
bash
# 获取CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
cpu_usage=$(printf "%.2f" "$cpu_usage")
if [ $cpu_usage > "80" ]; then
echo "CPU的使用率是"$cpu_usage
fi
CPU的使用率是8.40
结果还是不尽人意
结论
在shell脚本中,浮点类型的数值,要和一个整数数值进行比较的话, 只能将浮点类型转换为整数,再使用
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)等比较运算符进行比较。
正确的写法应该是
bash
# 获取CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
cpu_usage_num=$(printf "%.0f" "$cpu_usage")
if [ $cpu_usage_num -gt 80 ]; then
echo $cpu_usage_num
echo -e "${localip} CPU使用率超过警戒值80%,当前的cpu使用率${cpu_usage}%"
fi