Bash中IF语句条件不生效:匹配不到changed仍发送邮件
问题原因分析
你的IF判断逻辑存在两个核心隐患,会导致无匹配时仍触发发送邮件的异常:
- 若实际运行的代码未给
$FILE变量加双引号包裹:当grep未匹配到内容时,$FILE为空,判断语句会变成语法错误的[ = "changed" ],部分旧版Shell遇到该类语法错误时会误将判断结果视为真,从而进入if分支。 - 若文件中存在多个
changed匹配项:grep -o会输出多行changed,此时$FILE是包含换行的多行文,和单行的"changed"字符串比较结果不符合预期,也可能出现逻辑判断异常。
最优修复方案
不需要捕获grep的输出内容,直接利用grep的退出码做判断即可:grep匹配到目标字符串时退出码为0,未匹配到时为非0,-q参数可以让grep静默执行不输出结果,写法更简洁高效:
if grep -q "changed" /home/_nonlocl/file2.txt; then echo "sending mail $send" else echo "fingerprint has not changed" fi
如果要保留你原来的写法,需要增加对空值、多匹配的兼容:
FILE=$(grep -o changed /home/_nonlocl/file2.txt | head -n1) if [ "$FILE" = "changed" ]; then echo "sending mail $send" else echo "fingerprint has not changed" fi
注意用$()代替反引号做命令替换是现在更推荐的写法,可读性和嵌套兼容性更好。
内容的提问来源于stack exchange,提问作者yishai
相关产品推荐
相关产品推荐

