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数值不一致的原因
两者显示差异主要来自两个点:
- 精度与四舍五入:df -h会把精确值四舍五入成友好的单位显示(比如15.7G显示为16G),而findmnt会输出更精确的原始计算值。
- 预留空间计算:df默认会扣除为root用户预留的磁盘空间(通常是总容量的5%),而findmnt显示的是磁盘实际剩余的全部空间,这会导致两者数值差出几个百分点。
解决办法是统一使用同一个工具获取空间值:如果想和df -h的显示对齐,就用df的输出;如果要实际剩余的全部空间,就用findmnt的字节模式输出。
内容的提问来源于stack exchange,提问作者user080320
相关产品推荐
相关产品推荐

