我正在从事一个小型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
我如何摆脱该信息...我还能做什么?
答案 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
请注意,您仍然需要在命令表达式两边加上双引号。