Bash错误[::应为整数表达式";
在下面的脚本中运行时,bashshellBash错误[::应为整数表达式";,bash,shell,Bash,Shell,在下面的脚本中运行时,bashshell[::预期的整数表达式“出现错误 #!/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!" eli
[::预期的整数表达式“
出现错误
#!/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
条件
服务状态:Sendmail和Postfix服务未在主机上运行
尽管如此,我已经测试了“==”而不是“-eq”进行比较和
[[]]
,但没有起作用。我假设您正在尝试评估进程列表中是否存在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),这就是您想要的。我假设您正在尝试评估进程列表中是否存在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),这就是您在这里想要的。在我看来,您将程序的退出状态与输出混淆了。var=$(命令)
将把命令的输出放在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
在我看来,您将程序的退出状态与输出混淆。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
您将所有输出发送到devnull,因此您的VAR中将没有任何内容。@123,即使没有将输出重定向到/dev/null 2>&1
给出整数
错误。因为这两个命令都不输出整数。您将所有输出发送到devnull,因此您的VAR中将没有任何内容。@123,即使没有重定向输出到/dev/null 2>&1
给出整数
错误。因为这两个命令都没有输出整数。我以前也尝试过相同的代码,但出现了相同的错误。在我建议的代码中,您看不到[::integer expression expected
错误,因为没有[
在该代码中进行测试。@Fred…..我的错..你是对的,但是在你的代码中,我们直接从ps-e | grep service
中评估条件,而不是通过测试条件进行测试..我在测试中尝试了相同的方法[]
条件失败,只是更新了我尝试的另一个代码。@Karn我不确定我是否理解您的意思。您需要的是直接从命令中进行评估,并摆脱[]
是您应该做的。它是解决方案,而不是问题。if
语句不需要以[]
或[[]]的形式进行测试
,任何命令的返回码也会起作用。虽然两个答案都是正确的,但我接受@Fred的答案,因为他是第一个发布的,但是我也投票了。我以前也尝试过相同的代码,但错误相同。你看不到[::整数表达式在我提出的代码中应为
错误,因为该代码中没有测试。@Fred…..我的错..你是正确的,但在你的代码中,我们直接从ps-e | grep服务
评估条件,而不是通过测试条件对其进行测试..我对测试[]
条件失败,只是更新了我尝试的另一个代码。@Karn我不确定我是否理解您的意思。您需要的是直接从命令中进行评估,并摆脱[]
是您应该做的。它是解决方案,而不是问题。if
语句不需要以[]
或[[]]的形式进行测试
,任何命令的返回码也可以。虽然两个答案都是正确的,但我接受@Fred的答案,因为他是第一个发布的,但是我也投票了两个。@Ljm…我只是更新了我的帖子,在那里我应用了测试条件,甚至它没有产生正确的状态并产生了整数
错误。啊,是的,删除引号。我错过了那一个。答案中的now中的完整脚本。Bash中的typeset已被弃用。@Ljm…我只是更新了我的帖子,在那里我应用了测试条件,甚至它没有产生正确的状态,并产生了整数错误。啊,是的,删除引号。我错过了那一个。答案中的now中的完整脚本。在Bas中h字体已弃用。