J'essaie de faire quelque chose d'assez commun: analyser l'entrée utilisateur dans un script shell. Si l'utilisateur a fourni un entier valide, le script fait une chose, et s'il n'est pas valide, il fait autre chose. Le problème, c'est que je n'ai pas trouvé de moyen facile (et raisonnablement élégant) de faire cela - je ne veux pas avoir à le séparer caractère par caractère.
Je sais que ça doit être facile mais je ne sais pas comment. Je pourrais le faire dans une douzaine de langues, mais pas BASH!
Dans mes recherches, j'ai trouvé ceci:
Expression régulière pour tester si une chaîne se compose d'un nombre réel valide en base 10
Et il y a une réponse là-dedans qui parle de regex, mais pour autant que je sache, c'est une fonction disponible en C (entre autres). Pourtant, il avait ce qui ressemblait à une bonne réponse, alors je l'ai essayé avec grep, mais grep ne savait pas quoi en faire. J'ai essayé -P qui sur ma boîte signifie le traiter comme une expression rationnelle PERL - nada. Dash E (-E) ne fonctionnait pas non plus. Et -F non plus.
Juste pour être clair, j'essaye quelque chose comme ça, à la recherche de n'importe quelle sortie - à partir de là, je vais pirater le script pour profiter de tout ce que je reçois. (IOW, je m'attendais à ce qu'une entrée non conforme ne renvoie rien pendant qu'une ligne valide se répète.)
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
Quelqu'un pourrait-il illustrer comment cela est le plus facile à faire?
Franchement, c'est une lacune de TEST, à mon avis. Il devrait avoir un drapeau comme celui-ci
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
[
est ancien compatibletest
;[[
est la nouveauté de Bash, avec plus d'opérations et des règles de cotation différentes. Si vous avez déjà décidé de vous en tenir à Bash, allez-y[[
(c'est vraiment beaucoup plus sympa); si vous avez besoin de portabilité vers d'autres coquilles, évitez[[
complètement.