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

Bash脚本根据命令结果发送邮件异常问题求助

问题分析与修复方案

我一眼就看到你脚本里的两个关键问题,这就是导致它和命令行执行结果不一致的原因:

1. 文件路径不匹配

你把grep的输出写到了/path/to/output/file.txt,但后面判断文件是否为空时用的是当前目录的file.txt——这两个根本不是同一个文件!系统找不到你要判断的目标文件,自然会触发错误的执行分支。

2. 条件判断逻辑完全搞反了

你的if [ -s file.txt ] || echo "file is empty"; then写法有严重逻辑问题:||的优先级会让整个条件变成「如果文件非空 或者 echo命令执行成功」,而echo永远会执行成功(返回值为0),所以这个if条件永远为真,不管实际文件有没有内容,都会执行then里的「发送空邮件」逻辑,else分支永远跑不到。


修复后的脚本

我帮你调整了路径和逻辑,还增加了变量来避免路径写错的问题:

#!/bin/bash

# 定义输出文件路径,统一管理避免出错
OUTPUT_FILE="/path/to/output/file.txt"

# 执行grep对比命令,结果写入指定路径
grep -vFxf /path/to/first/file /path/to/second/file > "$OUTPUT_FILE"

# 正确判断文件状态:为空则发送Empty邮件,非空则发送带内容的邮件
if [ ! -s "$OUTPUT_FILE" ]; then
    # 文件为空的情况
    swaks -t "1@email.com" -f "norply@email.com" --header "Subject: sample" --body "Empty"
else
    # 文件非空的情况,这里把文件内容作为邮件正文,你可以按需调整
    swaks -t "1@email.com" -f "norply@email.com" --header "Subject: sample - Has Content" --body "$(cat "$OUTPUT_FILE")"
fi

关键调整说明:

  • 用变量OUTPUT_FILE统一管理文件路径,避免重复输入时的路径错误
  • 把条件改成[ ! -s "$OUTPUT_FILE" ],意思是「如果文件 不 是非空的」(即文件为空或不存在),完全符合你要的判断逻辑
  • 所有引用变量时都加了双引号,避免文件名含空格等特殊字符时出现异常
  • 在else分支补充了读取文件内容作为邮件正文的写法,你可以根据实际需求修改

这样脚本就能和你在命令行执行的结果一致,正确根据文件内容发送对应的邮件了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:51:34