if else语句输出不正确

时间:2014-06-22 23:00:13

标签: bash

我正在开发一个自定义Nagios脚本,该脚本将监视cPanel以确保它正在运行并根据从服务cpanel状态输出获得的内容返回状态。这就是我所拥有的:

##############################################################################
#   Constants

cpanelstate="running..."

ALERT_OK="OK - cPanel is running"
ALERT_CRITICAL="CRITICAL - cPanel is NOT running"
###############################################################################

cpanel=$(service cpanel status | head -1)

if [ "$cpanel" = "$cpanelstate" ]; then

        echo $ALERT_OK
        exit 0
else
        echo $ALERT_CRITICAL
        exit 2

fi

exit $exitstatus

当我运行脚本时,这是我得到的输出:

root@shared01 [/home/mvelez]# /usr/local/nagios/libexec/check_cpanel 
CRITICAL - cPanel is NOT running

当我运行脚本时,cPanel IS RUNNING但这是我得到的输出。事实上,无论cPanel的状态报告是什么,这都是输出。当我注释掉ELSE,ECHO和EXIT 2语句时:

#else
#       echo $ALERT_CRITICAL
#       exit 2

它返回一个空白输出:

root@shared01 [/home/mvelez]# /usr/local/nagios/libexec/check_cpanel 
root@shared01 [/home/mvelez]#

我不确定我做错了什么,因为我很擅长打击脚本并试着学习。非常感谢您提供的任何和所有帮助!

2 个答案:

答案 0 :(得分:1)

下面的代码应该可以使用,但您可能需要使用sudo运行它,因为' service'普通用户可能无法使用。

#!/bin/bash

##############################################################################
#   Constants

cpanelstate="running"

ALERT_OK="OK - cPanel is running"
ALERT_CRITICAL="CRITICAL - cPanel is NOT running"
###############################################################################

cpanel=$(service apache2 status | head -1)
echo CPANEL $cpanel
if [[ $cpanel == *$cpanelstate* ]]; then

        echo $ALERT_OK
        exit 0
else
        echo $ALERT_CRITICAL
        exit 2

fi

答案 1 :(得分:0)

@Oleg Gryb's answer解决了您的问题,但至于原始脚本无效的原因:

[ "$cpanel" = "$cpanelstate" ]完整命令输出(例如cpsrvd (pid 10066) is running...)与预期输出的{em>子串进行比较,running... 平等,显然会失败。

解决方案是使用bash的模式匹配,通过其[[ ... ]]条件的右侧提供(bash的高级替代[ ... ]条件):

[[ "$cpanel" == *"$cpanelstate" ]]

*表示任何字符序列,因此如果$cpanel $cpanelstate结尾,则此条件返回true(请注意*必须如何不加引号被认为是特殊模式char。)