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
相关推荐
Beekeeper&&P...3 小时前
git bash是什么,git是什么,git中的暂存区是什么,git中的本地仓库是什么,git中工作目录指的是什么
开发语言·git·bash
独行soc3 天前
#渗透测试#SRC漏洞挖掘#网络运维# 黑客脚本编写04之脚本与用户交互
运维·安全·面试·bash·交互
꧁薄暮꧂4 天前
Linux解决 -bash: nc: command not found&-bash: nc: 未找到命令
linux·运维·bash
曹天骄5 天前
mac怎么看当前终端是zsh还是bash
开发语言·macos·bash
No8g攻城狮5 天前
【异常解决】Linux shell报错:-bash: [: ==: 期待一元表达式 解决方法
linux·运维·bash
茶颜悦色vv5 天前
shell脚本(2)
linux·web安全·网络安全·bash
?crying6 天前
深入理解 source 和 sh、bash 的区别
linux·开发语言·bash
爱编程的小金毛球球9 天前
-bash: /home/xxx/anaconda3/bin/conda: No such file or directory
linux·conda·bash
冷心笑看丽美人10 天前
RHEL 网络配置(Linux网络服务器 09)
linux·运维·服务器·网络·bash
日晨难再10 天前
C语言&Python&Bash:空白(空格、水平制表符、换行符)与转义字符
linux·c语言·开发语言·python·bash