对于Shell脚本,if [ $? -eq 0 ] 的含义是什么?

48

我看到一个 shell 脚本中有这样一行代码:

grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME}  > /dev/null
if [ $? -eq 0 ] 

1
谢谢Wyzard和Chris,你们的回答非常棒!不过我只能选择一个答案。>< - OCB
这个问题是在2011年8月18日提出并回答的,但由于与2011年8月30日提出并回答的问题相似,因此被关闭。为什么我们要允许这个 o_o。请点赞以保持开放状态。 - OCB
有没有保持这个问题开放的好理由,比如:与其他问题有什么不同? - Nico Haase
3个回答

47

$?是最近执行的命令的退出状态码;按照惯例,0表示成功,其他任何值表示失败。该行代码用于检查grep命令是否成功。

grep的man页面说明:

如果找到所选行,则退出状态为0,如果未找到,则为1。如果发生错误,则退出状态为2。(注意:POSIX错误处理代码应检查是否为'2'或更大。)

因此,在这种情况下,它检查是否找到了任何ERROR行。


44

代码正在检查 grep 的返回值($?)。在这种情况下,它正在将其与0(成功)进行比较。

通常当你看到像这样的东西(检查grep的返回值)时,它是在检查特定字符串是否被检测到。虽然将其重定向到 /dev/null 不是必要的,但可以使用 -q 来实现相同的效果。


一个问题,/dev/null在哪里?它是什么?它是一个文件吗? - OCB
6
/dev/null 是一种特殊的“黑洞”文件,当你向其中写入数据时,这些数据会被直接丢弃。使用它是一种经典的方法来阻止程序将输出打印到屏幕上。 - Chris Eberle
补充@Chris的评论,/dev/null意思是“空设备”。当我想到/dev/null实际上是什么时,它似乎并不是一个很好的用户名选择。 - Daniel Haley

4

这是一种极度过时的检查命令成功或失败的方法。通常,您所给出的代码片段将被重构为:

if grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME} > /dev/null; then
   ...
fi

(虽然在某些情况下可以使用'grep -q'而不是重定向到/dev/null,但这样做并不具有可移植性。许多grep实现不支持-q选项,因此如果您使用它,您的脚本可能会失败。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接