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