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
任务:使用 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