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

时间:2015-11-29 13:17:38

标签: bash mutt

任务:使用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”否执行

1 个答案:

答案 0 :(得分:2)

你不能在没有作弊的情况下使其成为单行。

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

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