如果[$? -eq 0]对shell脚本意味着什么?

时间:2011-08-18 03:19:47

标签: bash shell

在我看过的shell脚本中有这一行:

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

3 个答案:

答案 0 :(得分:36)

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

通常当你看到这样的东西(检查grep的返回值)时,它会检查是否检测到特定的字符串。虽然没有必要重定向到/dev/null,但使用-q可以实现同样的目标。

答案 1 :(得分:34)

$?是最近执行的命令的退出状态;按惯例,0表示成功,其他任何表示失败。该行正在测试grep命令是否成功。

grep联机帮助页指出:

  

如果找到选定的行,则退出状态为0,如果未找到,则退出状态为1。如果发生错误,则退出状态为2.(注意:POSIX错误处理代码应检查“2”或更高。)

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

答案 2 :(得分:3)

检查命令成功/失败是一种极度过度使用的方法。通常,您提供的代码段将重构为:

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

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