Condições e intervalos dentro de instruções case no bash

1

Eu estava escrevendo um plugin para o Nagios para verificar o número de pacotes de segurança e fazer uma declaração de caso como o aqui .

mas a coisa toda acabou se transformando em um show de aberrações. Tudo o que eu basicamente queria fazer era dizer que se houvesse entre 1-20 pacotes mostrassem esse aviso, se 21 infinitos mostrassem algo crítico e assim por diante, mas eu não poderia fazer apenas [ -gt 1 ] ou mesmo [20-10000]

Ao aplicar esses intervalos, o script seria executado de forma irregular e avisaria quando era para ser crítico, etc. Acho que percebi que intervalos não são realmente possíveis aqui, estou apenas imaginando por que funcionou para o exemplo dado acima mas não para mim. Além disso, é possível incluir condições no caso?

No final, consegui fazer um script totalmente funcional, mas tive que criar condições e passá-las para o caso. Só queria saber se havia uma maneira mais fácil de fazer isso sem ter que fazer isso.

Abaixo está mais ou menos o que eu estava tentando fazer. A última parte foi apenas eu estar desesperado tentando várias faixas diferentes para ver se funcionava.

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
    
por Ulukai 15.10.2015 / 00:01

1 resposta

2

Você não pode expressar intervalos de números facilmente nas expressões case - o padrão [1000-9999] , por exemplo, não significa os números 1000 a 9999 , mas os caracteres 1 , 0 , 0 , o intervalo 0-9 , os caracteres 9 , 9 , 9 - essencialmente, todos os dígitos. [1-85] não significa os números 1 a 85 , mas os dígitos de 1 a 8 e 5 , ... que são apenas os dígitos de 1 a 8 . Portanto, [1-20]* significa qualquer coisa que comece com 1 , 2 ou 0 - então, mesmo 20000000 corresponderá a isso. Use 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
    
por muru 15.10.2015 / 00:12