Estou tentando fazer algo bastante comum: analisar a entrada do usuário em um script de shell. Se o usuário forneceu um número inteiro válido, o script faz uma coisa e, se não for válido, faz outra. O problema é que não encontrei uma maneira fácil (e razoavelmente elegante) de fazer isso - eu não quero ter que separá-lo char por char.
Sei que deve ser fácil, mas não sei como. Eu poderia fazer isso em uma dúzia de idiomas, mas não em BASH!
Em minha pesquisa, descobri o seguinte:
Expressão regular para testar se uma string consiste em um número real válido na base 10
E há uma resposta aqui que fala sobre regex, mas até onde eu sei, essa é uma função disponível em C (entre outras). Ainda assim, ele teve o que parecia ser uma ótima resposta, então tentei com grep, mas grep não sabia o que fazer com ele. Tentei -P, que na minha caixa significa tratá-lo como uma expressão regular PERL - nada. Traço E (-E) também não funcionou. E nem -F.
Só para ficar claro, estou tentando algo assim, procurando qualquer saída - a partir daí, vou hackear o script para aproveitar o que conseguir. (IOW, eu esperava que uma entrada não conforme retornasse nada enquanto uma linha válida fosse repetida.)
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
Alguém poderia ilustrar como isso é feito mais facilmente?
Francamente, isso é uma lacuna do TEST, na minha opinião. Deve ter uma bandeira como esta
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
[
é compatível com o antigotest
;[[
é a novidade do Bash, com mais operações e diferentes regras de cotação. Se você já decidiu ficar com o Bash, vá em frente[[
(é realmente muito melhor); se precisar de portabilidade para outros shells, evite[[
completamente.