Shell: como testar uma variável numérica

Faça uma pergunta
Em um ambiente shell, as variáveis são, por padrão, do tipo string (cadeia de caracteres).

Assim, não é possível declarar uma variável do tipo inteira (isto não completamente verdadeiro, nós veremos isto no final desta dica).

Então, até agora era preciso usar pequenos truques mais ou menos arranjados para definir se sim ou não uma variável era do tipo inteira.

Exemplos de testes

Vejamos três exemplos usando, respectivamente, os comandos grep, expr e test acoplados à certas instruções de controle como o código de retorno de um comando.


Observação: nos seguintes exemplos, nós consideramos que a variável $var é inicializada de acordo com o parâmetro $1 passado diretamente na linha de comando depois da chamada de cada script.

Comando grep

Observação: no exemplo que segue, a expressão [ [:digit:] ] deve ser escrita sem espaços entre as chaves duplas:


#!/bin/bash
# script_grep.sh

var=$1
if [ "$(echo $var | grep "^[ [:digit:] ]*$")"]
then
echo "A cadeia numérica"
fi

Comando expr

Avaliação do código de retorno (aqui na variável $statut) depois de um teste em uma operação aritmética com a ajuda do comando expr:


#!/bin/sh
# script_expr.sh

var=$1
expr $var + 0 1>/dev/null 2>&1
statut=$?
if test $statut -lt 2
then
echo "$var" numérico
fi

Comando test

Avalia-se com a ajuda do comando Test (representado aqui pelas chaves [ ]) se o valor da variável $var for igual à zero (0); depois, avalia-se o código de retorno ($?) para seus dois estados de saída (verdadeiro ou falso, dizendo de outra forma 0 ou 1) que, como nos dois casos, seria do tipo inteira. Em um outro caso, código de retorno superior à 1, insucesso de avaliação:


#!/bin/bash
# script_test.sh

var=$1
[ $var -eq 0 ] 2> /dev/null
if [ $? -eq 0 -o $? -eq 1 ]
then
echo "A cadeia é numérica"
fi

Variável do tipo inteira

Como salientado no início da dica, é possível inicializar uma variável do tipo inteira graças à shell POSIX.

A criação de uma variável de tipo inteira deve previamente ser declarada com a ajuda do comando
typeset –i
ou
let
.

Veja um exemplo que implementa o comando let para determinar se uma variável é bem do tipo inteira:


#!/bin/sh
# script_let.sh

var=$1

if let $var 2>/dev/null
then
echo "$var numérico"
else
echo "$var não numérico"
fi

Note que a linha if let $var 2>/dev/null poderia muito bem ser escrita em uma destas formas:
if let var 2>/dev/null
ou
if ((var)) 2>/dev/null
.

Foto: © Linux.