【问题标题】:The return code from 'grep' is not as expected on Linux'grep' 的返回码在 Linux 上不如预期
【发布时间】:2017-07-04 05:34:36
【问题描述】:

我很难理解为什么下面的代码会返回 1。

echo 'Total' | grep -c No
0

所以“总”中不存在“否”。但随后查看它的返回码,我发现它是 1。

echo $?
1

为什么返回码显示为 1?有没有办法解决这个问题?

【问题讨论】:

  • grep 仅在匹配某些字符串时返回零。此规则也适用于grep -c

标签: linux bash shell grep


【解决方案1】:

退出代码为 1,因为 grep 没有匹配任何内容。

退出状态 如果找到选定的行,则退出状态为 0,如果未找到,则退出状态为 1。 如果发生错误,则退出状态为 2。(注意:POSIX 错误处理 代码应检查 '2' 或更大。)

输出为零,因为“Total”的计数为零。这是由于 -c 选项:

-c, --count 抑制正常输出;而是打印匹配行数 对于每个输入文件。使用 -v, --invert-match 选项(请参阅 下面),计算不匹配的行。 (-c 由 POSIX 指定。)

如果您想强制退出代码为 0,您只需将 || true 附加到您的命令:

echo 'Total' | grep -c No || true

【讨论】:

  • 另外,|| : 似乎也适用于 bash。
【解决方案2】:

根据man grep页面,-c标志是为

-c, --count 抑制正常输出;而是打印每个输入文件的匹配行数。

所以您看到的是匹配计数,不要与 grep 匹配的退出代码混淆。代码1 是因为没有与输入匹配的行。

看看另一个案例,

echo 'No' | grep -c No
1

echo $?
0

也可以在EXIT CODESman grep 页面上阅读,

退出状态 通常,如果选择了一行,则退出状态为 0,如果未选择任何行,则退出状态为 1,如果发生错误,则退出状态为 2。

【讨论】:

  • 您必须从 bash Shebang #!/bin/bash -e 注释中删除 -e,否则 grep exit 1 状态仍会导致您的脚本退出。
猜你喜欢
  • 2012-11-08
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多