shell - 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
我怎样才能摆脱该消息...我还能做什么?
解决方案
如果$(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
请注意,您仍然需要在命令表达式周围使用双引号。
推荐阅读
- bash - 如果语句未正确评估
- php - 为 Ansible Composer 模块定义 PHP 版本
- ios - 如何在 swift 中使打开 collectionView 的动画效果(如视频)
- c# - 错误:操作必须使用可更新查询
- node.js - 如何在 postgres 中进行多个查询
- ios - 当检测到的图像在 AR 中消失时,如何停止 videoNode?
- python - 如何使它成为帕斯卡三角形。表示第一行是 1,然后是第二行是 1,1,第三行是 1,2,1
- amazon-web-services - 从客户端调用 API 时出现错误代码 500
- omnet++ - Omnetpp.ini - 如何为主机参数创建循环
- android - 如何为 Facebook 登录设置登台和生产应用程序?