Условия и диапазоны в инструкциях case в bash

Я писал плагин для Nagios, чтобы проверить количество пакетов безопасности и сделал заявление о ситуации, как здесь.

но все это закончилось тем, что превратилось в странное шоу. Все, что я в основном хотел сделать, это сказать, есть ли от 1 до 20 пакетов, показывающих это предупреждение, если 21-бесконечность показывает критическое и так далее, но я не мог просто сделать [ -gt 1 ] или даже [20-10000]

При применении этих диапазонов скрипт будет работать нерегулярно и предупреждать, когда он должен быть критическим, и т. Д. Я думаю, что я понял, что диапазоны здесь не совсем возможны, мне просто интересно, почему это работает для приведенного выше примера, но не для мне. Кроме того, возможно ли каким-либо образом включить условия в дело?

В конце концов мне удалось сделать полностью рабочий сценарий, но мне пришлось создать условия if и передать их на рассмотрение. Просто интересно, есть ли более простой способ сделать это без необходимости делать это.

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

case $SECURITY_PACKAGES in

   0)

   echo "OK - not bad: There are a total of $TOTAL_PACKAGES packages to upgrade in this server, but none of them are security updates!"

   exit 0

   ;;

   [1-20]*)

  echo "WARNING - $TOTAL_PACKAGES packages required to upgrade in this server, of which $SECURITY_PACKAGES are security updates"

 exit 1
  ;;

   [21-99]|[100-999]|[1000-9999]*)

   echo "CRITICAL -  $SECURITY_PACKAGES out of $TOTAL_PACKAGES are security     updates! Consider upgrading soon!"

 exit 2
;;

*) echo "UNKNOWN - I am not sure what's happening now, check later or check server: $TOTAL_PACKAGES to upgrade, $SECURITY_PACKAGES are security updates"

exit 3
;;

esac

1 ответ

Решение

Вы не можете легко выразить диапазоны номеров в case выражения - шаблон [1000-9999], например, не означает цифры 1000 в 9999, но персонажи 1, 0, 0, диапазон 0-9, персонажи 9, 9, 9 - по существу, все цифры. [1-85] не означает цифры 1 в 85, но цифры от 1 в 8, а также 5... которые представляют собой только цифры от 1 в 8, Так [1-20]* означает все, что начинается с 1, 2, или же 0 - так даже 20000000 будет соответствовать этому. использование if/then/elif/else/fi вместо:

if (( $SECURITY_PACKAGES == 0 ))
then
    echo "OK - not bad: There are a total of $TOTAL_PACKAGES packages to upgrade in this server, but none of them are security updates!"
    exit 0
elif (( $SECURITY_PACKAGES <= 20 ))
then
    echo "WARNING - $TOTAL_PACKAGES packages required to upgrade in this server, of which $SECURITY_PACKAGES are security updates"
    exit 1
elif (( $SECURITY_PACKAGES <= 9999 ))
then
    echo "CRITICAL -  $SECURITY_PACKAGES out of $TOTAL_PACKAGES are security     updates! Consider upgrading soon!"
    exit 2
else
    echo "UNKNOWN - I am not sure what's happening now, check later or check server: $TOTAL_PACKAGES to upgrade, $SECURITY_PACKAGES are security updates"
    exit 3
fi
Другие вопросы по тегам