grep命令退出状态代码

时间:2018-04-09 09:48:13

标签: grep

退出状态部分报告中的grep手册:

EXIT STATUS
       The  exit  status is 0 if selected lines are found, and 1 if not
       found.  If an error occurred the exit status is 2.  (Note: POSIX
       error handling code should check for '2' or greater.)

但是命令:

echo ".
..
test.zip"|grep -vE '^[.]'
echo $?

echo "test.zip
test.txt"|grep -vE '^[.]'
echo $?

返回的值总是0.我会预期为1和0.我做错了什么?

1 个答案:

答案 0 :(得分:1)

请记住,grep是基于行的。如果任何一行符合,你就得到一个匹配。 (在您的第一种情况下test.zip匹配(更确切地说:您与-v一起使用,因此您要求的行与您的模式不匹配,而test.zip完全符合,即不匹配你的模式。结果你的grep调用成功了。比较

$ grep -vE '^[.]' <<<$'.\na'; echo $?
a
0

$ grep -vE '^[.]' <<<$'.\n.'; echo $?
1

注意第一个命令如何输出行a,即它找到匹配,这就是退出状态为0的原因。将其与第二个示例进行比较,其中没有匹配的行。

<强>参考

<<<是一个字符串:

Here Strings
    A variant of here documents, the format is:

           [n]<<<word

    The word undergoes brace  expansion,  tilde  expansion,  parameter  and
    variable  expansion,  command  substitution,  arithmetic expansion, and
    quote removal.  Pathname expansion and  word  splitting  are  not  per-
    formed.   The  result  is  supplied  as a single string, with a newline
    appended, to the command on its standard input (or file descriptor n if
    n is specified).
   $ cat <<<'hello world'
   hello world

$'1\na'用于获取多行输入(\n替换为$'string'中的换行符,有关详情,请参阅man bash)。

$ echo $'1\na'
1
a