Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash if-else语句输出不正确_Bash - Fatal编程技术网

Bash if-else语句输出不正确

Bash if-else语句输出不正确,bash,Bash,我正在开发一个定制的Nagios脚本,该脚本将监视cPanel,以确保它正在运行,并根据从服务cPanel status的输出中得到的信息返回状态。这就是我所拥有的: ############################################################################## # Constants cpanelstate="running..." ALERT_OK="OK - cPanel is running" ALERT_CRITIC

我正在开发一个定制的Nagios脚本,该脚本将监视cPanel,以确保它正在运行,并根据从服务cPanel status的输出中得到的信息返回状态。这就是我所拥有的:

##############################################################################
#   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正在运行,但这是我得到的输出。事实上,无论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]#

我不确定我没有正确地做什么,因为我对bash脚本非常陌生,并且一直在努力学习。非常感谢您的帮助

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

#!/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
解决了您的问题,但关于原始脚本无法运行的原因:

[“$cpanel”=“$cpanelstate”]
比较了完整的命令输出-例如,
cpsrvd(pid 10066)正在运行…
,与预期输出的子字符串,
正在运行…
进行相等性比较,这显然会失败

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

[[“$cpanel”=*“$cpanelstate”]


*
表示任何字符序列,因此如果
$cpanel
$cpanelstate
结尾,则此条件返回true(请注意
*
必须如何取消引号才能识别为特殊模式字符)。

从您的问题来看,您似乎错过了一些基本的调试步骤;例如,您没有指出
$cpanel
的实际值是多少,这表明您可能没有尝试打印出来查看?谢谢您的回复。我认为该语句的输出将被发送到if语句。如果我添加echo命令来打印字符串,那么如何将其放入If语句中,以便对其进行处理并给出正确的最终输出?哪个shell正在执行您的脚本?您的脚本的shebang行是什么(
#!/bin/…
)?如果没有,你的壳是什么?
service cpanel status
以交互方式返回什么?它是否可能向stderr报告(尽管您在运行脚本时应该看到stderr的输出)?它应该是#/bin/bash,但即使我补充说它仍然不能正常工作。运行service cpanel status时的输出如下:root@shared01[/home/mvelez]#服务cpanel状态cpsrvd(pid 10066)正在运行。。。entropychat is stopped stunnel is stopped qrunner is stopped如果
服务cpanel状态
打印到stderr(同样,这与您报告的内容不一致,但值得一试),请尝试
cpanel=$(服务cpanel状态2>&1 | head-1)
;另外,在shebang行之后添加
set-xv
,以查看脚本在运行时执行的操作。是的,这很有效!这是我得到的输出:root@shared01[/home/mvelez]35;/usr/local/nagios/libexec/checkêcpanel cpsrvd(pid 10066)正在运行。。。好的-cPanel正在运行我停止了它并再次运行了它,这是我得到的:root@shared01[/home/mvelez]#/usr/local/nagios/libexec/check\cpanel cpanel cpsrvd已停止正常-cpanel正在运行它应该会引发一个严重问题-cpanel没有运行但它没有运行。看起来我的“service”命令的输出与你的不同。我将很快更新答案。我刚刚更新了答案,以包括您的具体情况。检查它。+1,但请不要恢复到用于命令替换的旧语法(
`…
vs.
$(…)
)。我很抱歉,我是一个老派,将更新答案。@Oleg Gryb是的,上面的更改更正了问题,它现在正在工作!谢谢你的帮助和解释。这有助于我理解我做错了什么,以及如何正确地做到这一点!这将帮助我再次学习如何使用它,并在其他情况下使用它。非常感谢@用户3765678:我很高兴听到这个消息;不客气。为了回答者和未来读者的利益:如果答案解决了您的问题,请单击旁边的大复选标记接受它;如果您觉得它至少有帮助,请单击向上箭头图标向上投票。