Bash错误[::整数表达式预期“

时间:2017-04-08 14:14:59

标签: bash shell

在脚本下运行时,我遇到了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”进行比较和[[]]但是没有用。

2 个答案:

答案 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,所以没有输出,因此smpm为空。

如果您想查看退出状态,请使用$?

#!/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