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
相关推荐
涵信6 小时前
Windows11 安装 Ubuntu-20.04,同时安装配置 zsh shell,配置 git 别名(alias),大大提高开发效率
linux·git·ubuntu·bash
云计算DevOps-韩老师9 小时前
【网络云计算】2024第52周-每日【2024/12/23】小测-理论&实操
linux·运维·服务器·开发语言·bash
qq_4336184416 小时前
shell 编程(二)
开发语言·bash·shell
weixin_4373982116 小时前
Linux扩展——shell编程
linux·运维·服务器·bash
yylの博客1 天前
Windows通过git-bash安装zsh
windows·git·bash·zsh
AI小白龙4 天前
【bash】linux中打包某个可执行文件及其依赖文件
linux·chrome·bash
YRr YRr4 天前
详解ROS环境配置:setup.bash 文件的功能与操作
开发语言·bash
云计算DevOps-韩老师5 天前
【网络云计算】2024第51周-每日【2024/12/18】小测-理论-写10个关于bash运算符和表达式的例子-解析
开发语言·bash
云计算DevOps-韩老师6 天前
【网络云计算】2024第50周-每日【2024/12/13】小测-理论-写10个Bash Shell脚本-解析
运维·网络·云计算·vim·bash·负载均衡·perl
云计算DevOps-韩老师6 天前
【网络云计算】2024第50周-每日【2024/12/14】小测-理论和实操-写5个Bash Shell脚本的if语句和交换机路由器的知识
linux·运维·服务器·网络·kubernetes·云计算·bash