如果[$? -ne 0];不工作?

时间:2016-10-13 00:13:13

标签: linux bash sh

我正在尝试检测正在运行的服务,如果没有,请尝试执行某些操作:

#!/bin/bash

service --status-all | grep 'My Service' &> /dev/null

if [ $? -ne 0 ]; then
    echo "Service not there."
else
    echo "Service is there."
fi

服务显然在那里,但我仍然得到"服务不在那里。"

我看过退出代码$?我想也许一系列命令中的退出代码可能对我们想要测试的内容产生影响?

所以我不确定那里出了什么问题?

1 个答案:

答案 0 :(得分:1)

要调试测试结果,请一次运行一步。

首先单独执行service --status-all并检查其输出。输出是否是您所期望的,并且实际上是否包括“我的服务”'你正在寻找?

然后运行service --status-all | grep 'My Service'并检查其输出并退出代码。它是否写出匹配,是否为退出代码零0

man grep告诉我们:

The grep utility exits with one of the following values:

 0     One or more lines were selected.
 1     No lines were selected.
 >1    An error occurred.

以及

-q, --quiet, --silent
         Quiet mode: suppress normal output.  grep will only search a file until a
         match has been found, making searches potentially less expensive.

此过程也有改进,你可以做...

if测试执行的命令列表的返回状态,如果该状态为零,则执行then分支。了解这一点,您只需测试grep的返回状态,而不是test的返回状态。

<强>预留:
您正在使用[命令,该命令也是test命令(try man test
当测试通过(成功)时,test命令退出0,或者当测试失败时退出1。

$ test 7 -eq 7;echo $?
0
$ test 7 -ne 7;echo $?
1
$ [ 7 -eq 2 ];echo $?
1

有了这些知识,你可以再次直接测试grep的退出代码 使用&#34; quiet&#34;来抑制grep的输出。标志而不是重定向,并使用grep -F作为固定字符串,即a.k.a。fgrep

if ./service --status-all | fgrep -q 'My Servvice'
then
    echo "Service IS there."
else
    echo "Service NOT there."
fi