【问题标题】:CentOS 7 -eq: unary operator expected [duplicate]CentOS 7 -eq:预期一元运算符[重复]
【发布时间】:2016-12-15 08:55:51
【问题描述】:

我必须检查 Tomcat 8 是否正在运行。为此,我使用以下脚本。

#!/bin/bash

statuscode=$(wget --server-response http://localhost:8080 2>&1 | awk '/^  HTTP/{print $2}')

if [ $statuscode -eq 200 ]
then
    echo "TOMCAT OK"
    exit 0
else
    echo "TOMCAT CRITICAL"
    exit 2
fi

当我在CentOS 7 上运行此脚本时。

如果Tomcat 8 正在运行,则脚本正在运行且没有任何错误。

如果 Tomcat 8 停止,则脚本正在运行并出现以下错误

第 5 行:[: -eq: 应为一元运算符

我该如何解决这个问题?

【问题讨论】:

  • 这是因为$statuscode 填充了一个空字符串或一些奇怪的东西。尝试在if 条件之前通过echoing 变量进行调试。
  • @fedorqui 是,当 tomcat 停止时 $statuscode 为空。我该如何处理?
  • 之前可以添加一个空变量检查。
  • 如果你引用正确([ "$statuscode" -eq 200 ]),你会得到一个更有用的错误;在将这些参数传递给[ 命令(又名测试)之前,缺少引号导致shell 将您的变量字符串拆分为未知数量的参数(在本例中为0)。

标签: bash shell command-line centos7


【解决方案1】:

在将变量与预期输出进行比较之前检查变量是否不为空。

#!/bin/bash

statuscode=$(wget --server-response http://localhost:8080 2>&1 | awk '/^  HTTP/{print $2}')

if [ -n "$statuscode" ] && [ $statuscode -eq 200 ]
then
    echo "TOMCAT OK"
    exit 0
else
    echo "TOMCAT CRITICAL"
    exit 2
fi

【讨论】:

  • 如果我的 tomcat 8 服务正在运行,那么 "wget --server-response localhost:8080 2>&1 | awk '/^ HTTP/{print $2}'" 总是会给我 200 或其他价值?
  • 应该有更好的方法来检查服务是否正在运行。就像systemctl 命令
【解决方案2】:

试试这个:

如果状态码为空,则抛出-eq: unary operator expected

#!/bin/bash
{
statuscode=$(wget --server-response http://localhost:80 2>&1 | awk '/^  HTTP/{print $2}')

if [ -z "$statuscode" ]
then
echo "TOMCAT CRITICAL";
exit 2;
else
  if [ $statuscode -eq 200 ]
    then
     echo "TOMCAT OK";
     exit 0;
  fi
fi
}

【讨论】:

  • Re "then throw -eq: unary operator expected.":这是在哪里发生的?你能详细说明吗?例如,"throw" 是什么意思?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多