编写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




