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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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错误[::应为整数表达式";_Bash_Shell - Fatal编程技术网

Bash错误[::应为整数表达式";

Bash错误[::应为整数表达式";,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

在下面的脚本中运行时,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!"
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字体已弃用。