我有一个(长)Bash脚本,可以执行以下操作:
set -o nounset
set -o errexit
set -o pipefail
echo -e "foo \n bar" | grep "baz" | tr -d ' '
echo "here"
脚本失败,没有错误消息,因为grep命令返回错误1而不打印任何错误消息。
如何使我的脚本健壮?
答案 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