ESXi shell 脚本正在删除一条消息

ESXi shell scripting getting rid of a message

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

if [ $(esxcli hardware ipmi bmc get |grep -i gate |awk '{print }') != " "  ]; 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 }')!=" "  ]; 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 operand" 信息:

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

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

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

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

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

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

如果 $(esxcli ...) 命令表达式没有产生任何输出,则要求 shell 对其求值:

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

这不是一个格式正确的表达式。要修复,请在 esxcli 命令表达式(括号外)两边加上双引号,如下所示:

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

执行此操作时,如果表达式的输出为空,shell 会看到:

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

这是它能理解的表达方式。

请注意,空字符串 "" 将不匹配您当前在 != 右侧的单个 space " "。您需要将 space 更改为空字符串,或切换到使用 -z 运算符("is the following a zero-length string?")或 -n 运算符("is the following a non-empty string?"),取决于哪个适合您的程序逻辑。 -n 是您现有逻辑想要的,它看起来像这样:

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

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