ESXi Shell脚本摆脱一条消息

时间:2018-08-28 13:06:18

标签: shell if-statement esxi

我正在从事一个小型VMware ESXi项目(个人项目,不适用于任何公司)。 我正在尝试构建一个包含表的html文件,该表包含来自ESXi OS的一些信息,例如时间/日期,OS版本,补丁号等。 但是,有些命令没有输出,然后我的表有一个空框(单元格)。 我正在尝试做的..而在...方面非常失败的是,我正在尝试在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!

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

但是,如果我将“!=”操作数放在“)”附近,就像这样:

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

.. it不再给出“ sh ::未知操作数”消息,但给出错误的结果“ Not Empty!”。 但是,如果我在if-else-fi语句中插入一条命令以提供输出,例如:

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

.. it不给出“ sh ::未知操作数”消息,并给出正确的结果为“不为空!”

我已经尝试了以下方式,但是给出了相同的“ sh ::未知操作数”消息:

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

我如何摆脱该信息...我还能做什么?

1 个答案:

答案 0 :(得分:1)

如果$(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

执行此操作时,如果表达式的输出为空,则外壳程序将看到:

  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

请注意,您仍然需要在命令表达式两边加上双引号。