首页 > 解决方案 > ESXi shell 脚本删除消息

问题描述

我正在开发一个小型 VMware ESXi 项目(个人项目,不为任何公司)。我正在尝试构建一个 html 文件,其中包含一个包含来自 ESXi 操作系统的一些信息的表,例如时间/日期、操作系统版本、补丁号等。但是有一些命令没有输出,然后我的表有一个空框(单元格)。我正在尝试做的......并且非常失败......是我试图在 shell 脚本中放置一个简单的 if-else-fi 语句,以检查输出是否为空。这是我使用检查命令是否有输出的命令:

if [ $(esxcli hardware ipmi bmc get |grep -i gate |awk '{print $2}') != " "  ]; then echo "Not Empty!"; else echo "Empty!"; fi

这样做的问题是,虽然它给出了正确的结果,但它也打印出以下内容:

sh:  : unknown operand
Empty!

是的,结果应该是“Empty!”,但我无法摆脱“sh :: unknown operand”消息。似乎不喜欢!= 操作数不接近“)”。

但是,如果我将“!=”操作数靠近“)”,如下所示:

if [ $(esxcli hardware ipmi bmc get |grep -i gate |awk '{print $2}')!=" "  ]; then echo "Not Empty!"; else echo "Empty!"; fi

..它不再给出“sh :: unknown operand”消息,但给出了错误的结果“Not Empty!”。但是,如果我在 if-else-fi 语句中插入一个给出输出的命令,例如:

if [ $(esxcli system time get) != " "  ]; then echo "Not Empty!"; else echo "Empty!"; fi

..它没有给出“sh :: unknown operand”消息,并给出正确的结果为“Not Empty!”

我尝试过以下方式,但它给出了相同的“sh::unknown operationand”消息:

if [[ $(esxcli hardware ipmi bmc get |grep -i gate |awk '{print $2}') != " "  ]]; then echo "Not Empty!"; else echo "Empty!"; fi

if [ -n $(esxcli hardware ipmi bmc get |grep -i gate |awk '{print $2}') ]; then echo "Not Empty!"; else echo "Empty!"; fi

if [ -z $(esxcli hardware ipmi bmc get |grep -i gate |awk '{print $2}') ]; then echo "Not Empty!"; else echo "Empty!"; fi

if "$(esxcli hardware ipmi bmc get |grep -i gate |awk '{print $2}')" == " " ; then echo "Not Empty!"; else echo "Empty!"; fi

if $(esxcli hardware ipmi bmc get |grep -i gate |awk '{print $2}')==" "; then echo "Not Empty!"; else echo "Empty!"; fi

我怎样才能摆脱该消息...我还能做什么?

标签: shellif-statementesxi

解决方案


如果$(esxcli ...)命令表达式不产生输出,则要求 shell 对此进行评估:

  if [   != " " ] ; then ...

这不是一个格式良好的表达式。esxcli要解决此问题,请在命令表达式周围(括号外)加上双引号,如下所示:

  if [ "$(esxcli hardware ipmi bmc get |grep -i gate |awk '{print $2}')" != " "  ]; then echo "Not Empty!"; else echo "Empty!"; fi

当你这样做时,如果表达式的输出为空,shell 会看到:

  if [ "" != " " ] ; then ...

这是它可以理解的表达方式。

请注意,空字符串与您当前在 . 右侧""的单个空格不匹配。您需要将该空间更改为空字符串,或切换到使用运算符(“以下是零长度字符串吗?”)或运算符(“以下是非空字符串吗?”),具体取决于哪一个适合您的程序逻辑。是您现有逻辑想要的,它看起来像这样:" "!=-z-n-n

  if [ -n "$(esxcli hardware ipmi bmc get |grep -i gate |awk '{print $2}')" ]; then echo "Not Empty!"; else echo "Empty!"; fi

请注意,您仍然需要在命令表达式周围使用双引号。


推荐阅读