Linux grep返回代码

dif*_*ous 26 linux bash shell grep

我很难理解以下为什么返回1的代码.

echo 'Total' | grep -c No
0
Run Code Online (Sandbox Code Playgroud)

因此"总计"中不存在"否".但是后来查看它的返回码我认为它是1.

echo $?
1
Run Code Online (Sandbox Code Playgroud)

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

Ini*_*ian 34

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

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

所以你看到的是比赛的数量,不要与grep比赛的退出代码混淆.代码1是因为输入没有匹配的行.

看看另一个案例,

echo 'No' | grep -c No
1

echo $?
0
Run Code Online (Sandbox Code Playgroud)

另外要阅读EXIT CODESman grep页面,

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

  • 您必须从bash Shebang的#!/ bin / bash -e注释中删除`-e`,否则grep exit 1状态仍然会导致脚本退出。 (3认同)

小智 18

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

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

输出为零,因为"总计"的计数为零.这是由于-c选项:

-c, - count抑制正常输出; 而是为每个输入文件打印匹配行的计数.使用-v, - inverse-match选项(见下文),计算不匹配的行.(-c由POSIX指定.)

如果你想强制退出代码为0,你可以只追加|| 对你的命令忠实:echo'Total'| grep -c否|| 真正