Bash脚本数值比较异常:Grep提取值部分区间判断不符预期
磁盘空间判断脚本的异常排查与修复
问题描述
我在CentOS 7主机上用这段脚本判断/data挂载点的磁盘空间,逻辑是已用空间≤60%则输出空间足够,否则提示不足:
if [[ $(df -h /data --output=pcent | tail -1 | grep -o -E [0-9]+) > 60 ]]; then echo "Not enough space on box"; else echo "Enough space on box"; fi
但遇到了两个异常场景:
- 测试输入
100%时,预期输出Not enough space on box,实际却输出Enough space on box - 测试输入
7%时,预期输出Enough space on box,实际却输出Not enough space on box
只有7-9这类个位数和100的情况出错,其他数值正常,怀疑是GNU grep 2.20的用法或者比较逻辑有问题。
问题根源
核心问题出在比较逻辑的类型错误:在bash的[[ ]]结构中,>是字符串比较运算符,不是数值比较。字符串比较是按ASCII字符的顺序逐一对比:
- 当比较
100和60时,第一个字符1的ASCII码小于6,所以100 > 60的字符串比较结果为假,触发else分支 - 当比较
7和60时,第一个字符7的ASCII码大于6,所以7 > 60的字符串比较结果为真,触发then分支
grep的[0-9]+或[0-9]*提取数值的操作是正常的,问题不在grep。
修复方案
要实现数值比较,需要用bash的数值比较语法,以下是几种可靠的修复方式:
方式1:用-gt数值比较运算符
先提取数值,再用-gt(大于)做判断:
# 提取已用百分比数值,grep的正则用单引号包裹避免shell解析 used_space=$(df -h /data --output=pcent | tail -1 | grep -o -E '[0-9]+') if [[ $used_space -gt 60 ]]; then echo "Not enough space on box" else echo "Enough space on box" fi
方式2:用(( ))算术扩展结构
(( ))会自动将内容当作数值处理,直接用>即可做数值比较:
if (( $(df -h /data --output=pcent | tail -1 | grep -o -E '[0-9]+') > 60 )); then echo "Not enough space on box" else echo "Enough space on box" fi
方式3:用awk简化数值提取(更可靠)
可以跳过grep,直接用awk处理df的输出,去掉百分号并提取数值:
used_space=$(df --output=pcent /data | awk 'NR==2 {sub(/%/,""); print $0}') if [[ $used_space -gt 60 ]]; then echo "Not enough space on box" else echo "Enough space on box" fi
内容的提问来源于stack exchange,提问作者genesisnickfosh
相关产品推荐
相关产品推荐

