De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Como posso saber se uma variável Var é numérica ou não?

Colaboração: Julio Cezar Neves

Data de Publicação: 5 de junho de 2022

Veja só que interessante uma discussão que surgiu na lista das dicas-l no telegram (https://t.me/DicasL):

O problema era:

Como posso saber se uma variável Var é numérica ou não?

Foram apresentadas diversas soluções:

  ((Var + 0)) &>- && echo Numérico

Fazendo assim, se $Var não fosse numérica o comando seria mal sucedido e a condição para o echo não seria satisfeita.

case $Var in
+([[:digit:]])) echo Numérico;;
*) echo Não numérico
esac

Aqui chamo a atenção para o uso de coringas estendidos (que se obtém com o shopt -s extglob), para obrigar que $Var seja formada só por algarismos.

 [[ $Var =~ ^[0-9]+$ ]] && echo Numérico 

Nesta o colega aproveitou para usar Expressões Regulares.

[[ -z ${Var//[0-9]/} ]] && echo Numérico

Deixei essa para o fim porque achei a mais criativa e eficiente. O colega de lista usou um comando test ([[ ... ]]) que executaria o echo caso o resultado da Expansão de Parâmetros para excluir todos os algarismos de $Var resultasse num conjunto vazio (-z). Mas como eu disse um pouco antes, se não houver o PARA, o texto que casar com o DE será excluído então a última barra (/) nem era necessária.

Essas foram as soluções que me lembro, mas devem ter havido outras. Isso demonstra como a programação em Shell pode ser criativa, pois sempre existem diversas formas de resolução para o mesmo problema.

Mas quero fazer uma observação sobre o item 1 acima, que pode passar despercebida; se $Var fosse igual a zero, o resultado seria errado porque matematicamente, o zero é falso. Para resolver isso, o melhor seria usar globbing estendido da seguinte forma:

 [[ $Var == +(0) ]] || ((Var + 0)) && echo Numérico 

Onde primeiramente testamos se $Var é formada por um ou mais zeros.



Veja a relação completa dos artigos de Julio Cezar Neves