【发布时间】:2017-07-04 05:34:36
【问题描述】:
我很难理解为什么下面的代码会返回 1。
echo 'Total' | grep -c No
0
所以“总”中不存在“否”。但随后查看它的返回码,我发现它是 1。
echo $?
1
为什么返回码显示为 1?有没有办法解决这个问题?
【问题讨论】:
-
grep仅在匹配某些字符串时返回零。此规则也适用于grep -c。
我很难理解为什么下面的代码会返回 1。
echo 'Total' | grep -c No
0
所以“总”中不存在“否”。但随后查看它的返回码,我发现它是 1。
echo $?
1
为什么返回码显示为 1?有没有办法解决这个问题?
【问题讨论】:
grep 仅在匹配某些字符串时返回零。此规则也适用于grep -c。
退出代码为 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。
根据man grep页面,-c标志是为
-c, --count 抑制正常输出;而是打印每个输入文件的匹配行数。
所以您看到的是匹配计数,不要与 grep 匹配的退出代码混淆。代码1 是因为没有与输入匹配的行。
看看另一个案例,
echo 'No' | grep -c No
1
echo $?
0
也可以在EXIT CODESman grep 页面上阅读,
退出状态 通常,如果选择了一行,则退出状态为 0,如果未选择任何行,则退出状态为 1,如果发生错误,则退出状态为 2。
【讨论】:
#!/bin/bash -e 注释中删除 -e,否则 grep exit 1 状态仍会导致您的脚本退出。