Сценарии оболочки ESXi избавляются от сообщения - PullRequest
0 голосов
/ 28 августа 2018

Я работаю над небольшим проектом VMware ESXi (личный проект, не для какой-либо компании). Я пытаюсь создать HTML-файл, который содержит таблицу с некоторой информацией из ОС ESXi, такой как время / дата, версия ОС, номер исправления и т. Д. Однако есть некоторые команды, которые не дают вывода, и тогда в моей таблице есть пустое поле (ячейка). То, что я пытаюсь сделать .. и ужасно терпит неудачу в ..., это то, что я пытаюсь вставить простое утверждение 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 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:: неизвестный операнд» и дает правильный результат «Не пусто!»

Я пытался следующими способами, но он выдал то же самое сообщение "sh:: unknown operand":

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 голосов
/ 29 августа 2018

Если выражение команды $(esxcli ...) не выдает результатов, оболочке предлагается оценить это:

  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

Обратите внимание, что вам все еще нужно использовать двойные кавычки вокруг выражения команды.

...