2017-02-15 42 views
7

我挣扎明白为什么在返回的1Linux的grep的返回码

echo 'Total' | grep -c No 
0 

所以“否”不存在“总”码以下。但随后查找其返回码,我将其视为1.

echo $? 
1 

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

+0

只有匹配某个字符串时'grep'才会返回零。这个规则也适用于'grep -c'。 –

回答

7

根据man grep页,-c标志是用于

-c,--count 禁止正常输出;而是为每个输入文件打印一个匹配行数。

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

看一看另一种情况下,

echo 'No' | grep -c No 
1 

echo $? 
0 

而且对man grepEXIT CODES阅读,

退出状态 通常情况下,退出状态为0如果选择了线,1如果没有行被选中,2如果发生错误。

6

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

退出状态 退出状态是0,如果选择的行被找到,并且如果1未找到。 如果发生错误,退出状态为2(注:POSIX错误处理代码 应检查是否有“2”或更大)。

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

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

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