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
相关推荐
dingdingfish18 小时前
Bash学习 - 第3章:Basic Shell Features,第5节:Shell Expansions
开发语言·学习·bash
xuchaoxin137519 小时前
bash@脚本中的命令行参数解析基础@shift命令@getopts
bash
礼拜天没时间.21 小时前
自定义镜像制作——从Dockerfile到镜像
linux·docker·容器·centos·bash
源文雨21 小时前
shell调用ffmpeg递归转换所有wav至flac的脚本
ffmpeg·bash·音视频·音频·unix·shell·音频编码
程序员敲代码吗2 天前
如何通过命令行启动COMSOL的参数化、批处理和集群扫描
java·c#·bash
dingdingfish3 天前
Bash 学习 - 第1章:Introduction
bash·shell·programming·introduction
xuchaoxin13754 天前
bash中的字符串处理@输出和格式化打印@echo@printf
chrome·bash
xuchaoxin13754 天前
bash@特殊字符@环境变量符号@特殊参数@参数扩展和替换@字符串处理用法总结
开发语言·bash
dingdingfish4 天前
Bash 学习 - 第2章:Definitions
bash·definition
xuchaoxin13754 天前
bash@参数扩展@参数转换@参数扩展操作符
bash