You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

编写Bash脚本检查目录空间并删除旧文件时遇算术错误求助

解决Shell脚本中磁盘空间检查与旧文件删除的问题

咱们先直击你遇到的核心错误:line 13: ((: 86% -gt 90%: division by 0 (error token is "90%")——这是因为你拿到的空间相关变量带了百分号%,但Bash的算术运算(( ))只能处理纯数字,没法解析带符号的字符串,直接触发了语法错误。另外你的脚本还有几个逻辑和变量的小问题,咱们一步步修正:

1. 修正磁盘使用率的获取逻辑

你的需求是**当目录所在磁盘使用率达到90%(可用空间不足10%)**时删除旧文件,但原代码里的df命令获取的是可用空间大小(KB),和你设定的ALERT=90(百分比阈值)根本没法直接比较。我们需要调整df的参数来获取磁盘使用率,并且去掉百分号:

# 获取磁盘使用率(不带%的纯数字)
USAGE=$(df -P "$FOLDER" | tail -1 | awk '{print substr($5, 1, length($5)-1)}')

这里用df -P保证输出格式统一(避免不同Linux发行版的df输出列错位),再用substr切掉最后一个%符号,得到能直接用于运算的纯数字。

2. 修正条件判断逻辑

原代码里的if (($SIZE -gt $ALERT));逻辑完全反了:你要的是**使用率≥90%**时执行删除,所以应该改成:

if (( USAGE >= ALERT )); then

3. 修复其他代码细节问题

  • 原代码里的NAME_TO_FOLDER_T)_MONITOR是无效变量,直接删除即可;
  • find命令里的$FOLDER/*会在目录为空时触发No such file or directory警告,改成"$FOLDER"配合-mindepth 1更稳妥;
  • 给所有变量加上双引号,避免路径包含空格或特殊字符时出现解析错误;
  • 补充参数校验和目录存在检查,让脚本更健壮,避免无效输入导致的崩溃。

完整修正后的脚本

#!/bin/bash
# Usage: cleanup_old_logs <folder> <days>
# Removes all log files in the directory older than a certain number of days

# 参数校验:确保用户传入正确数量的参数
if [ $# -ne 2 ]; then
    echo "Error: Invalid number of arguments"
    echo "Usage: $0 <folder> <days>"
    exit 1
fi

ALERT=90
FOLDER="$1"
N_DAYS="$2"

# 检查目标目录是否存在
if [ ! -d "$FOLDER" ]; then
    echo "Error: Directory $FOLDER does not exist"
    exit 1
fi

# 获取磁盘使用率(不带百分号)
USAGE=$(df -P "$FOLDER" | tail -1 | awk '{print substr($5, 1, length($5)-1)}')

# 检查磁盘使用率是否达到阈值
if (( USAGE >= ALERT )); then
    echo "Disk usage is ${USAGE}%, reaching threshold of ${ALERT}%. Deleting files in $FOLDER older than $N_DAYS days..."
    # 统计要删除的文件数量
    COUNT=$(find "$FOLDER" -mindepth 1 -maxdepth 1 -mtime +"$N_DAYS" -type f | wc -l)
    echo "Found $COUNT files to delete."
    # 执行删除(去掉注释即可生效)
    # find "$FOLDER" -mindepth 1 -maxdepth 1 -mtime +"$N_DAYS" -type f -exec rm -f {} \;
    echo "Cleanup completed."
else
    echo "Disk usage is ${USAGE}%, below threshold of ${ALERT}%. No cleanup needed."
fi

关键细节说明

  • df -P:采用POSIX标准输出格式,确保在不同Linux发行版下输出列的位置一致;
  • substr($5, 1, length($5)-1):精准移除使用率列的最后一个%符号,得到可用于算术运算的纯数字;
  • 双引号包裹变量:避免路径包含空格、特殊字符时出现解析错误;
  • -mindepth 1:防止find命令误匹配到目录本身($FOLDER);
  • 参数与目录检查:提前拦截无效输入,让脚本的报错信息更清晰。

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

火山引擎 最新活动