You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:35:26