Bash脚本变量与数值比较报错,请求排查原因
问题分析与修复方案
看起来你这两个错误都是脚本里的语法和变量赋值问题导致的,我给你逐个拆解并修复:
第一个错误:[: unexpected operator
这个问题有两个核心原因:
- 变量赋值完全错误:你写的
newValue=sudo /usr/bin/find...是错的——这样会把newValue直接设为字符串sudo,然后把后面的find命令当成独立命令执行,导致newValue根本没拿到你想要的文件计数,后续比较时自然出问题。 - 字符串比较符的兼容性问题:如果用
sh而非bash执行脚本,POSIX标准的[命令不支持!=这种字符串比较符,而我们这里是做数值比较,应该用专门的数值运算符。
第二个错误:arithmetic expression: expecting primary: "1-"
这个是第一个错误的连锁反应:因为newValue没被正确赋值(要么是空值,要么是字符串sudo),执行$(($apacheCount-$newValue))时就变成了数字 - 无效值,Bash无法解析这种算术表达式,所以报错。
修复后的完整脚本
我把所有问题都修正了,还优化了一些细节:
#!/bin/bash # This script checks if your Apache log is older than two weeks. # If so, the files will be deleted # Defining savepath savePath="/var/log/test.log" # Startup printf "\n*** Starting logrotate at $(date +'%m-%d-%y %H:%M:%S') ***" >> "$savePath" # Check if Apache logs older than two weeks are existing apacheCount=$(sudo /usr/bin/find /var/log/apache2/ -iname "access.log.*.gz" -mtime +15 | wc -l) # If so, delete 'em! if [ "$apacheCount" -ne 0 ]; then # 注意:你原脚本删除用的是-mtime +8,和检查的+15不一致,我改成了统一的+15,需要的话可以改回去 sudo /usr/bin/find /var/log/apache2/ -iname "access.log.*.gz" -mtime +15 -exec rm -f {} \; newValue=$(sudo /usr/bin/find /var/log/apache2/ -iname "access.log.*.gz" -mtime +15 | wc -l) if [ "$newValue" -eq 0 ]; then printf "\n$(date +'%m-%d-%y %H:%M:%S'): $apacheCount Apache Log(s) has / have been deleted." >> "$savePath" else printf "\n$(date +'%m-%d-%y %H:%M:%S'): There was an error. $(($apacheCount - $newValue)) items were not deleted." >> "$savePath" fi else printf "\n$(date +'%m-%d-%y %H:%M:%S'): No Apache Log older than two weeks found." >> "$savePath" fi
关键修复点说明
- 正确捕获命令输出:用
$()代替旧的反引号来捕获find命令的计数结果,这是现代Bash推荐的写法,更易读还支持嵌套。 - 数值比较用专用运算符:把
!=改成-ne(不等于),==改成-eq(等于),这是数值比较的标准写法,兼容性更好。 - 变量加引号:给
$savePath这类变量加上双引号,避免路径出现空格时脚本崩溃(好习惯要保持)。 - 统一
-mtime参数:原脚本检查的是超过15天的日志,但删除的是超过8天的,逻辑不一致,我改成了统一的15天,你可以根据需求调整。
另外,执行脚本时最好用bash your_script.sh,或者给脚本加执行权限后直接./your_script.sh(第一行的#!/bin/bash会让系统自动用Bash执行),别用sh your_script.sh,避免POSIX Shell的兼容性问题。
内容的提问来源于stack exchange,提问作者user7269972
相关产品推荐
相关产品推荐

