2017-04-08 131 views
0

我进入了错误的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

虽然,我已经测试 “==”,而 “当量”作为比较和[[]]但没有奏效。

+1

你的所有输出发送到devnull,所以会有没有在你的增值经销商。 – 123

+0

@ 123,即使没有将输出重定向到发生'integer'错误的'/ dev/null 2>&1'。 – krock1516

+0

因为这些命令都不输出整数。 – 123

回答

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),这正是您想要的。

+0

我之前也尝试过相同的代码,但同样的错误。 – krock1516

+0

在我提出的代码中,你看不到'[::integer expression expected''错误,因为在那个代码中没有'[''测试。 – Fred

+0

@Fred .....我的坏..你是对的,但在你的代码中,我们直接评估'ps -e | grep服务'而不是测试它通过测试条件..我试着同样的测试'[]'条件和失败,只是更新了另一个代码我试过.. – krock1516

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 
+0

@Ljm ....我只是更新了我的帖子,在那里我应用了测试条件,甚至没有产生正确的状态并产生'integer'错误。 – krock1516

+0

啊是的,删除引号。我错过了那一个。完整的脚本现在在答案中。 Bash排版中的 –

+1

已弃用。 – krock1516