Je n'arrive pas à comprendre comment je peux m'assurer qu'un argument passé à mon script est un nombre ou non.
Tout ce que je veux faire, c'est quelque chose comme ça :
test *isnumber* $1 && VAR=$1 || echo "need a number"
Une aide ?
MISE À JOUR : J'ai réussi (avec L'aide de Charles ) pour le faire, mais je ne suis pas encore sûr que ce soit la meilleure façon de le faire (même si cela a fonctionné lors de mes tests). Voici comment cela s'est terminé :
[[ $1 =~ "^[0-9]+$" ]] && echo "number" && exit 0 || echo "not a number" && exit 1
20 votes
Soit dit en passant, le
test && echo "foo" && exit 0 || echo "bar" && exit 1
que vous utilisez peut avoir des effets secondaires inattendus -- si l'écho échoue (peut-être que la sortie est vers un FD fermé), la fonctionexit 0
sera ignoré, et le code essaiera alors deecho "bar"
. S'il échoue également à ce niveau, le&&
échouera, et il n'exécutera même pasexit 1
! En utilisant lesif
plutôt que de&&
/||
est moins sujet à des effets secondaires inattendus.0 votes
@CharlesDuffy C'est le genre de réflexion vraiment intelligente que la plupart des gens n'ont que lorsqu'ils doivent traquer des bugs poilus... ! Je n'avais jamais pensé que l'écho pouvait renvoyer un échec.
11 votes
J'arrive un peu tard dans la soirée, mais je connais les dangers dont Charles a parlé, car j'y ai été confronté il y a quelque temps. Voici donc une ligne 100% infaillible (et bien lisible) pour vous :
[[ $1 =~ "^[0-9]+$" ]] && { echo "number"; exit 0; } || { echo "not a number"; exit 1; }
Les crochets indiquent que les choses ne doivent PAS être exécutées dans un sous-shell (ce qui serait sans aucun doute le cas avec()
parenthèses utilisées à la place). Avertissement : Ne manquez jamais le point-virgule final . Sinon, vous risquez de provoquerbash
pour imprimer les messages d'erreur les plus laids (et les plus inutiles)...8 votes
Cela ne fonctionne pas dans Ubuntu, à moins que vous n'enleviez pas les guillemets. Donc ça devrait juste être
[[ 12345 =~ ^[0-9]+$ ]] && echo OKKK || echo NOOO
0 votes
...j'ai supprimé la réponse (erronée) de la question - une partie de la raison pour laquelle les réponses devraient être séparées est qu'elles peuvent être commentées, votées, corrigées, etc. individuellement.
6 votes
Vous devez être plus spécifique sur ce que vous entendez par "nombre" . Un nombre entier ? Un nombre à virgule fixe ? Une notation scientifique ("e") ? Y a-t-il une plage requise (par exemple, une valeur non signée de 64 bits), ou autorisez-vous tout nombre pouvant être écrit ?
0 votes
C'est incroyable que Bash ne fournisse pas un moyen fiable et intégré de valider si une valeur est numérique ou non. Le nombre, la variété et la variation de la qualité des réponses ici indiquent que c'est un problème sérieux.
0 votes
Bash fournit un moyen fiable de déterminer si un nombre est un INTEGER. { VAR="asdfas" ; (( VAR )) ; echo $? ; } L'équation échouera correctement si la réponse est '0' car '0' n'est pas un nombre entier. J'ai eu le même problème il y a quelques minutes et j'ai trouvé ce fil de discussion en faisant une recherche rapide. J'espère que cela aidera d'autres personnes. D'autres personnes n'étaient pas loin.
0 votes
Le type du film Votre code donne des messages moches sur stderr. Par exemple
((5a))
donnebash: ((: 5a: value too great for base (error token is "5a")