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

Shell脚本设置磁盘最大可用空间及报错问题求助

解决Shell脚本磁盘空间判断的两个问题

问题1:"integer expression expected"错误原因及解决

这个报错是因为你用了带小数和单位的字符串(比如15.7G)去做整数比较,Shell的[或test命令只能处理纯整数,没法识别带单位的浮点数。解决核心是把磁盘空间转换成纯数字的统一单位(比如字节、整数GB),再和阈值做比较。

具体实现方式

有两种可靠的转换思路:

  • 用字节数(最精确):获取磁盘可用空间的纯字节数字,把阈值也转换成字节数,再做整数比较。
  • 用整数GB(简化版):把空间转换成四舍五入后的整数GB,阈值设为整数,再比较。

字节数方案示例

#!/bin/bash
# 设定阈值:16GB,转换成字节(16*1024^3)
MAX_AVAIL=$((16 * 1024 ** 3))
# 目标挂载点,比如日志所在的/var分区
MOUNT="/var"

# 用df获取可用字节数(和df -h逻辑一致,会减去root预留空间)
avail_bytes=$(df -B1 --output=avail "$MOUNT" | tail -n1)
# 或者用findmnt获取实际全部剩余字节数(不扣预留空间)
# avail_bytes=$(findmnt -o AVAIL -b -n "$MOUNT")

# 整数比较
if [ "$avail_bytes" -ge "$MAX_AVAIL" ]; then
    echo "可用空间达标,开始压缩日志..."
    # 这里写你的压缩逻辑,比如压缩7天前的非压缩日志
    find /var/log -type f -name "*.log" ! -name "*.gz" -mtime +7 -exec gzip {} \;
else
    echo "可用空间不足,跳过压缩"
fi

整数GB方案示例

#!/bin/bash
# 设定阈值:16GB(整数)
MAX_AVAIL=16
MOUNT="/var"

# 用df获取整数GB(四舍五入后),去掉单位G
avail_gb=$(df -BG --output=avail "$MOUNT" | tail -n1 | sed 's/G//')

if [ "$avail_gb" -ge "$MAX_AVAIL" ]; then
    echo "可用空间达标,开始压缩日志..."
    find /var/log -type f -name "*.log" ! -name "*.gz" -mtime +7 -exec gzip {} \;
else
    echo "可用空间不足,跳过压缩"
fi

问题2:findmnt和df -h数值不一致的原因

两者显示差异主要来自两个点:

  1. 精度与四舍五入:df -h会把精确值四舍五入成友好的单位显示(比如15.7G显示为16G),而findmnt会输出更精确的原始计算值。
  2. 预留空间计算:df默认会扣除为root用户预留的磁盘空间(通常是总容量的5%),而findmnt显示的是磁盘实际剩余的全部空间,这会导致两者数值差出几个百分点。

解决办法是统一使用同一个工具获取空间值:如果想和df -h的显示对齐,就用df的输出;如果要实际剩余的全部空间,就用findmnt的字节模式输出。

内容的提问来源于stack exchange,提问作者user080320

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:12:37