Linux 如何使用grep的返回状态值?

Linux 如何使用grep的返回状态值?,linux,bash,variables,grep,tail,Linux,Bash,Variables,Grep,Tail,为什么我的命令没有返回“0” 如果我删除“echo$?”并使用tail获取check\u error\u output.txt中最后出现的“Unable”,它将正确返回。如果我删除tail-1,或者用&&替换它,它将按预期返回 我遗漏了什么?我通过在grep和$之间添加括号解决了这个问题 (grep 'Unable' check_error_output.txt && echo $?) | tail -1 使用过程替换: cat <(grep 'Unable' check

为什么我的命令没有返回“0”

如果我删除“echo$?”并使用tail获取check\u error\u output.txt中最后出现的“Unable”,它将正确返回。如果我删除tail-1,或者用&&替换它,它将按预期返回


我遗漏了什么?

我通过在grep和$之间添加括号解决了这个问题

(grep 'Unable' check_error_output.txt && echo $?) | tail -1

使用过程替换:

cat <(grep 'Unable' check_error_output.txt) <(echo $?) | tail -1

cat以下方法实现了您想要的功能,而无需使用管道或子壳

grep-q“无法”检查\u error\u output.txt&&echo$?

-q标志表示安静/无声

从手册页:

安静;不要将任何内容写入标准输出。如果发现任何匹配项,即使检测到错误,也立即以零状态退出。阿尔索 请参阅-s或--no messages选项。(-q由POSIX指定。)

这仍然不是故障安全的,因为“没有这样的文件或目录”错误仍然会以两种方式出现

我建议使用以下方法,因为它将输出任何一种类型的返回值:

grep -q 'Unable' check_error_output.txt 2> /dev/null; echo $?

主要区别在于,无论它是失败还是成功,您仍然会得到返回代码,错误消息将被定向到/dev/null。注意我是如何使用“;”而不是“&&&”,使其响应任一类型的返回值。

检查if语句中任何命令的返回值的最简单方法是:
if cmd;然后
。例如:

if grep -q 'Unable' check_error_output.txt; then ...

我不明白它在这种情况下有什么用处?基本上,我正在尝试获取我的命令的返回状态,以便在脚本中使用。啊,我明白了,好吧-你的标题有点误导性哈哈:)让我为Yasa更改一下,你想做什么?在文件的最后一行中找到“无法”的出现?我试图通过grep检查文件中是否存在“无法”,并且只返回$的输出?因此,我可以在我的bash脚本中的if语句中使用该输出。请看一下我的答案,它以一种干净的方式实现了这一点。我还想知道我的if语句的输出是否返回为1,请参阅我对@Raman Sailopalth的评论。在我建议的方法下,第二位代码就是这样做的,它将为grep输出任何返回代码。感谢@UlisesAndréfirero的评论/回答-这完全符合我通过命令行希望的效果。但是,我的脚本现在还有其他问题,特别是根据返回代码(0或1)从if语句中回显,它总是生成与返回代码1相对应的回显,无论发生什么,请参见我的代码部分:outputfile=/example/folder/structure/check\u error\u output.txt if[“grep-q'Unable'$outputfile&&echo$?”=“0”];然后echo-e“ERROR MESSAGE FOUND”else echo-e“NO ERROR MESSAGES HAVE becound”fi您最好再问一个问题,但尝试使用$(grep-q'Unable'$outputfile&&echo$?)而不是引号。引号不会展开,无论$()威尔。这对于OP试图实现的目标来说似乎有点过于臃肿。我认为在这种情况下,流程替代和管道都是不必要的。
if grep -q 'Unable' check_error_output.txt; then ...