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
相关推荐
张志翔的博客5 天前
如何在 macOS 上切换 Shell:从 Bash 到 Zsh 或其他 Shell
开发语言·macos·bash
zhengqiqiqinqin5 天前
reboot提示 -bash: fork: retry: 没有子进程
开发语言·bash
顾安r7 天前
11.22 脚本 手机termux项目分析(bash)
前端·python·stm32·flask·bash
Solyn_HAN10 天前
非编码 RNA(ceRNA/lncRNA/circRNA)分析完整流程:从数据下载到功能验证(含代码模板)
python·bash·生物信息学·r
叶羽西10 天前
Bash基础知识-[[和]]用于条件测试
开发语言·bash
不想画图10 天前
Linux——小白初识shell脚本(二)
linux·运维·bash
裤裤兔11 天前
linux提取指定前缀文件到其他文件夹
linux·运维·服务器·bash·终端
凄戚12 天前
bash和命令
开发语言·chrome·bash
Evan芙12 天前
Bash 变量命名规则与类型使用
linux·运维·开发语言·chrome·bash
归叶再无青12 天前
nginx从入门到实践全指南
运维·nginx·bash