没有错误消息的grep错误

时间:2014-02-19 09:59:19

标签: bash grep

我有一个(长)Bash脚本,可以执行以下操作:

set -o nounset
set -o errexit
set -o pipefail

echo -e "foo \n bar" | grep "baz" | tr -d ' '

echo "here"

脚本失败,没有错误消息,因为grep命令返回错误1而不打印任何错误消息。

如何使我的脚本健壮?

2 个答案:

答案 0 :(得分:1)

如果模式无法匹配,

grep将产生非零退出代码。此外,它不会产生任何错误消息。如果在输入中找不到模式,为了获得错误消息,您需要一个替代方案。您可以使用awk

echo -e "foo \n bar" | \
awk 'BEGIN{f=0}/baz/{f=1;print;}END{if (!f) {print "Error; string not found"; exit 1;}}' | \
tr -d ' '

这与grep(就退出代码而言)非常相似,并且如果找不到匹配则会产生错误消息。

为了将错误消息输出到STDERR,您可以说:

echo -e "foo \n bar" | \
awk 'BEGIN{f=0}/baz/{f=1;print;}END{if (!f) {print "Error; string not found" > "/dev/stderr"; exit 1;}}' | \
tr -d ' '

答案 1 :(得分:1)

您可以使用grep -q并检查其返回状态:

if $(echo -e "foo \n bar" | grep -q "baz"); then
    echo "grep success"
else
    echo "grep failure"
fi