在Linux上,“grep”的返回代码与预期不符

59

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

echo 'Total' | grep -c No
0

所以,“总和”中不存在“不”的意思。但是查询它的返回代码时,我发现它的值为1。

echo $?
1

为什么返回代码显示为1?有没有办法避免这种情况?


4
grep 只有在匹配到字符串时才会返回零。这个规则同样适用于 grep -c - P....
2个回答

74
根据man grep页面,-c标志用于:

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

因此,您看到的是匹配数量,不要将其与grep匹配的退出代码混淆。代码1是因为没有从输入中匹配到任何行。

看看另一种情况,

echo 'No' | grep -c No
1

echo $?
0

另外,要在man grep页面上阅读退出代码

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


15
您需要从 Bash 的 Shebang #!/bin/bash -e 注释中删除 -e,否则 grep 的退出状态 1 仍会导致脚本退出。 - b01

61

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

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

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

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

如果你想强制退出代码为0,你可以在命令后面加上|| true

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

1
另外,在bash中似乎也可以使用|| : - Asclepius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接