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

Bash脚本IF语句逻辑异常排查:IP未变更时仍触发邮件发送的问题

问题分析与修复:Bash脚本无论IP是否变更都发送邮件的原因

兄弟,我一眼就瞅出问题在哪了——你把sendemail命令的执行时机完全搞错啦!

问题根源

看你脚本里这行代码:

sendIP=$(sendemail -f ... 包含敏感信息的完整语法)

这里的$(...)是Bash的命令替换语法,它会在脚本执行到这一行的时候,立刻运行括号里的sendemail命令,然后把命令的输出结果存到sendIP变量里。也就是说,不管后面的if判断逻辑是什么,这行代码一跑就已经发邮件了!后面的echo $sendIP只是把命令的输出打印出来,根本不是触发发送的动作——邮件早在判断IP之前就已经发出去了。

修复后的脚本

把sendemail命令直接放到if的条件分支里,只在IP变更时才执行它:

#! /bin/bash
catvar=$(cat AAA | tail -1 | awk '{ print $2 }')
date=$(date +"%d-%m-%y")
add1=$(wget -qO- icanhazip.com)

# 只有当IP变更时,才执行发送邮件的命令
if [ "$catvar" != "$add1" ]; then
    sendemail -f ... 包含敏感信息的完整语法
    echo "$date $add1" >> AAA
else
    echo same
fi

额外优化建议

可以加个小判断处理AAA文件不存在的情况(比如第一次运行脚本时),避免空文件导致catvar为空的异常:

#! /bin/bash
date=$(date +"%d-%m-%y")
add1=$(wget -qO- icanhazip.com)

# 处理文件不存在的初始情况
if [ ! -f AAA ]; then
    echo "$date $add1" >> AAA
    sendemail -f ... 包含敏感信息的完整语法
    exit 0
fi

catvar=$(cat AAA | tail -1 | awk '{ print $2 }')
if [ "$catvar" != "$add1" ]; then
    sendemail -f ... 包含敏感信息的完整语法
    echo "$date $add1" >> AAA
else
    echo same
fi

另外,有些服务器默认没装wget,可以用curl替代获取公网IP:add1=$(curl -s icanhazip.com)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:24:03