我很难理解为什么下面的内容返回1的代码。
echo 'Total' | grep -c No
0
所以,“总和”中不存在“不”的意思。但是查询它的返回代码时,我发现它的值为1。
echo $?
1
为什么返回代码显示为1?有没有办法避免这种情况?
man grep
页面,-c
标志用于:
-c, --count 取消正常输出;而是为每个输入文件打印匹配行的计数。
因此,您看到的是匹配数量,不要将其与grep
匹配的退出代码混淆。代码1
是因为没有从输入中匹配到任何行。
看看另一种情况,
echo 'No' | grep -c No
1
echo $?
0
另外,要在man grep
页面上阅读退出代码
,
退出状态通常为0(如果选择了一行),1(如果未选择任何行)和2(如果发生错误)。
#!/bin/bash -e
注释中删除 -e
,否则 grep 的退出状态 1 仍会导致脚本退出。 - b01因为grep没有匹配到任何内容,所以退出代码为1。
退出状态 如果找到了选定的行,则退出状态为0,如果未找到则为1。 如果发生错误,则退出状态为2。(注意:POSIX错误处理代码应检查“2”或更高版本。)
输出结果为零,因为'Total'的计数为零。这是由于-c选项:
-c,--count 抑制正常输出;而是为每个输入文件打印匹配行的计数。 对于不匹配的行,请使用-v、--invert-match选项(参见下文)进行计数。(-c由POSIX指定。)
如果你想强制退出代码为0,你可以在命令后面加上|| true
:
echo 'Total' | grep -c No || true
|| :
。 - Asclepius
grep
只有在匹配到字符串时才会返回零。这个规则同样适用于grep -c
。 - P....