Bash 检查空输出并在一行中禁用脚本执行

Bash check empty output and disable script execution in one line

任务:使用 clamav 扫描病毒并报告是否存在受感染的文件

一行脚本

clamscan -ir --exclude=/proc --exclude=/sys --exclude=/dev / | grep "Infected files: [1-9].*" -z | mutt -s 'Viruses detected' -- email1@domain.com email2@domain.com email3@domain.com

问题:如果命令 "clamscan ...| grep" 返回空输出(未发现病毒,受感染文件:0),则发送电子邮件消息

子任务:在不使用临时文件的情况下编写 bash 脚本。仅使用重定向输出函数并检查输出是否为空然后 "Mutt" 不执行

不作弊就成不了单行本。

直接的解决方案是捕获输出并在匹配时使用它:

if output=$(clam etc | grep etc); then
    mutt etc <<<"$output"
fi

作弊是以某种方式隐藏此功能:

mongrel () {  # aka "mutt maybe"
    input=$(cat -)
    case $input in '') return 1;; esac
    mutt "$@" <<<"$input"
}
clam etc | grep etc | mongrel etc

如果有很多输出,我可能实际上更喜欢一个临时文件而不是将结果保存在内存中;但如果这是你的任务,我不会去那里。

顺便说一下,grep 正则表达式中的尾随通配符没有任何价值——除非它以某种方式帮助你理解(我认为它没有;更像是增加了混乱)我会离开出来了。

仅通过电子邮件发送结果摘要的价值值得怀疑——在我看来,在出现感染时发送整个报告会更好。

output=$(clamscan -ir --exclude=/proc --exclude=/sys --exclude=/dev /)
case $output in *"Infected files: [1-9]"*)
   mutt -s 'Viruses detected' -- email1@domain.com email2@domain.com email3@domain.com <<<"$output" ;;
esac