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

Bash脚本变量与数值比较报错,请求排查原因

问题分析与修复方案

看起来你这两个错误都是脚本里的语法和变量赋值问题导致的,我给你逐个拆解并修复:

第一个错误:[: unexpected operator

这个问题有两个核心原因:

  1. 变量赋值完全错误:你写的newValue=sudo /usr/bin/find...是错的——这样会把newValue直接设为字符串sudo,然后把后面的find命令当成独立命令执行,导致newValue根本没拿到你想要的文件计数,后续比较时自然出问题。
  2. 字符串比较符的兼容性问题:如果用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

关键修复点说明

  1. 正确捕获命令输出:用$()代替旧的反引号来捕获find命令的计数结果,这是现代Bash推荐的写法,更易读还支持嵌套。
  2. 数值比较用专用运算符:把!=改成-ne(不等于),==改成-eq(等于),这是数值比较的标准写法,兼容性更好。
  3. 变量加引号:给$savePath这类变量加上双引号,避免路径出现空格时脚本崩溃(好习惯要保持)。
  4. 统一-mtime参数:原脚本检查的是超过15天的日志,但删除的是超过8天的,逻辑不一致,我改成了统一的15天,你可以根据需求调整。

另外,执行脚本时最好用bash your_script.sh,或者给脚本加执行权限后直接./your_script.sh(第一行的#!/bin/bash会让系统自动用Bash执行),别用sh your_script.sh,避免POSIX Shell的兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:41:33