在脚本下运行时,我遇到了bash shell [: : integer expression expected"
的错误。
#!/bin/bash
sm=$(ps -e | grep sendmail > /dev/null 2>&1)
pm=$(/etc/init.d/postfix status > /dev/null 2>&1)
check_mail(){
if [ "$sm" -eq 0 ]; then
echo "Service Status: Sendmail is Running!"
elif [ "$pm" -eq 0 ]; then
echo "Service Status: Postfix Service is Running!"
else
echo "Service Status: Both Sendmail & Postfix Service is Not Running On $(uname -n)"
fi
}
check_mail
在运行上面的脚本时,它只显示
else
的输出 条件。
Service Status: Both Sendmail & Postfix Service is Not Running On host
虽然,我已经测试了“==”而不是“-eq”进行比较和[[]]
但是没有用。
答案 0 :(得分:2)
我假设您正在尝试评估进程列表中sendmail的存在。您应该将代码更改为:
#!/bin/bash
check_mail(){
if
ps -e | grep sendmail > /dev/null 2>&1
then
echo "Service Status: Sendmail is Running!"
elif
/etc/init.d/postfix status > /dev/null 2>&1
then
echo "Service Status: Postfix Service is Running!"
else
echo "Service Status: Both Sendmail & Postfix Service is Not Running On $(uname -n)"
fi
}
check_mail
原始代码失败的原因是您使用命令替换$()
捕获命令的输出。标准输出,即不是退出代码。然后,当使用[ -eq ]
测试时,它需要一个整数参数(你的变量不包含),它会失败并显示你得到的消息。由于两个测试总是失败,因此输入else
子句。
通过将实际命令放在if
语句的条件中,您使用实际的数字返回码(0
表示true,非零表示false),这就是你想要的
答案 1 :(得分:2)
在我看来,您将程序的退出状态与输出混淆。var=$(command)
会将command
的输出放在var
中。正如123的评论所述,因为您将所有内容重定向到/dev/null
,所以没有输出,因此sm
和pm
为空。
如果您想查看退出状态,请使用$?
:
#!/bin/bash
typeset -i pm
typeset -i sm
ps -e | grep sendmail > /dev/null 2>&1
sm=$?
/etc/init.d/postfix status > /dev/null 2>&1
pm=$?
check_mail(){
if [ $sm -eq 0 ]; then
echo "Service Status: Sendmail is Running!"
elif [ $pm -eq 0 ]; then
echo "Service Status: Postfix Service is Running!"
else
echo "Service Status: Both Sendmail & Postfix Service is Not Running On $(uname -n)"
fi
}
check_mail