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
相关产品推荐
相关产品推荐

