在我看过的shell脚本中有这一行:
grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME} > /dev/null
if [ $? -eq 0 ]
答案 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选项,所以如果你的脚本可能会失败使用它。)