是否有更好的方法来处理以下有条件处理输出的标准方式?
output="$(program | grep -E 'some text')"
if [ ! -z "$output" ]; then
echo "$output" | mail -s 'captured output' to
fi
我正在考虑明显错误的事情
program | grep -E 'some text' | { [[ $? == 0 ]] && mail -s 'captured output' to; }
答案 0 :(得分:2)
有一种方法可以在不必捕获输出的情况下完成。在某些情况下(即巨大的输出),这可能是更可取的。像这样的东西,可以很容易地重复使用:
execute_on_input()
{
local c=
local r=0
IFS= read -r -n 1 c || r=$?
[[ "$c" ]] || return 0
{ echo -n "$c" ; [[ $r != 0 ]] || cat ; } | "$@"
}
program | grep -E 'some text' | execute_on_input mail -s 'captured output'
该函数检查它是否可以读取某些东西,如果它不能退出而不启动位置参数(“$ @”)中传递的命令。如果找到输出,则通过管道传递给位置参数中接收的命令(首先读取第一个字符,然后使用cat
读取未使用第一个read
读取的输出的其余部分)。
答案 1 :(得分:1)
grep
的退出状态会告诉您是否匹配。
if output=$(program | grep -E 'some text'); then
printf '%s' "$output" | mail -s 'captured output' to
fi
但是,mail
(至少我正在查看的版本)有一个选项-E
,可防止发送空消息,从而无需进行检查。
program | grep -E 'some text' | mail -E -s 'captured output' to
答案 2 :(得分:0)
您可以将if [ ! -z "$output" ]
替换为if [ -n "$output" ]
(或if [ -n "${output}" ]
)。其他可能性也会这样做,为什么要让它更难阅读呢?
明确使用test
将显示您正在做的事情:
test -n "${output}" && echo "output filled"