shell中的浮点类型数值如何进行比较运算

在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
相关推荐
dingdingfish8 小时前
GNU Parallel 学习 - 第1章:How to read this book
bash·shell·gnu·parallel
dingdingfish12 小时前
GNU Parallel 学习笔记 - 总目录
bash·gnu·parallel
鸠摩智首席音效师17 小时前
Linux Bash 中如何追加内容到文件 ?
linux·运维·bash
Laughtin3 天前
macos命令行更换终端代理的方法
macos·bash·mac
zmjjdank1ng3 天前
理解bash和shell
linux·运维·开发语言·bash
Bdygsl4 天前
Linux小程序(2)—— bash模拟实现
linux·bash
weixin_462446235 天前
一键安装单节点 Zookeeper 3.8.5(附完整 Bash 脚本)
zookeeper·debian·bash
鸠摩智首席音效师8 天前
如何创建带参数的 Bash 别名 ?
linux·bash
gjxDaniel8 天前
Bash编程语言入门与常见问题
开发语言·bash
Engineer-Jsp10 天前
A problem occurred starting process ‘command ‘bash‘‘
开发语言·bash