【问题标题】:grep error without error message没有错误信息的grep错误
【发布时间】:2014-02-19 09:59:18
【问题描述】:

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

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

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

echo "here"

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

如何使我的脚本健壮?

【问题讨论】:

  • 来自grep 手册页:“退出状态 grep 实用程序以下列值之一退出:0 选择了一行或多行。1 未选择行。>1 发生错误。 "因此,退出值为 1 仅表示未找到字符串(如预期的那样),而不是发生错误。
  • 如果在 grep 中找不到字符串,您期望什么输出?
  • grep 如果未找到匹配项,则不会写入任何错误。
  • Bentoy13:我希望没有输出,但我希望我的脚本将这种情况视为错误,并妥善管理。
  • @user744629 set -e ?

标签: bash grep


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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 ' '
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 2017-06-21
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多