Quelle serait la meilleure façon de vérifier si $ 1 est un entier dans / bin / dash?
En bash, je pourrais faire:
[[ $1 =~ ^([0-9]+)$ ]]
Mais cela ne semble pas être conforme à POSIX et le tableau de bord ne prend pas en charge cela
shell
regular-expression
string
dash
Martin Vegter
la source
la source
foo\n123\nbar
n'est pas un entier, mais réussirait ce test.Que
dash
,bash
,ksh
,zsh
, POSIXsh
, ouposh
( "une remise en marche de la coque Bourne"sh
); lacase
construction est la plus largement disponible et la plus fiable:la source
dash
? Cela fonctionne pour moi sousbash
mais pasdash
.dash
; pour interroger le résultat, j'ai ajoutéecho $?
après la commande de cas.posh
("une réimplémentation du shell Bourne") n'a pas non plus de problème avec cette solution.case
; une raison est le bogue que vous décrivez, un autre qui, dans les éditeurs qui ont des fonctionnalités qui reposent sur des parenthèses correspondantes (vim), il offre un bien meilleur support, et non des moindres, je trouve personnellement mieux lisible de les faire correspondre. - WRTposh
étant POSIX; eh bien, la citation de la page de manuel que j'ai donnée suggérait autre chose, mais on ne peut pas s'appuyer sur de telles déclarations informelles de toute façon, je suppose. Le vieux bourne shell n'est de toute façon plus aussi important maintenant que nous sommes à l'ère POSIX.Vous pouvez utiliser le
-eq
test sur la chaîne, avec lui-même:Si le message d'erreur est un problème, redirigez la sortie d'erreur vers
/dev/null
:la source
" 023 "
c'est un chiffre. Notez qu'il fonctionne avec dash, mais pas tous les autres shells POSIX car le comportement n'est pas spécifié si les opérandes sont des entiers décimaux de note. Par exemple avec ksh, cela dirait queSHLVL
ou1+1
est un nombre.Essayez de l'utiliser comme une expansion arithmétique et voyez si cela fonctionne. En fait, vous devez être un peu plus strict que cela, car les extensions arithmétiques ignoreraient les espaces de début et de fin, par exemple. Faites donc une expansion arithmétique et assurez-vous que le résultat développé correspond exactement à la variable d'origine.
Cela accepterait également les nombres négatifs - si vous voulez vraiment les exclure, ajoutez un chèque supplémentaire pour
$((${1} >= 0))
.la source
[[
$(( ... ))
? Si c'est le cas, ma réponse devrait toujours être matériellement correcte, il me suffit d'ajouter quelques citations supplémentaires.check_if_number 1.2
et la fonction est revenue:dash: 3: arithmetic expression: expecting EOF: "1.2"
Peut-être avec
expr
?la source
match
ne\+
sont POSIX. Cela signifierait également que 0 n'est pas un nombre. Vous voulezexpr "x$1" : 'x[0-9]\{1,\}$'
Dans le système POSIX, vous pouvez utiliser expr :
la source
expr
implémentations diront que 999999999999999999999 n'est pas un entier. POSIX ne donne aucune garantie que cela fonctionnera. En pratique, sur un système GNU au moins, il dira que la "longueur" est un entier.expr 9999999999999999999 + 0
me donne un statut 3 de sortie etexpr -12 + 0
etexpr length + 0
me donner un statut de sortie 0 avec GNU expr (+ string
forcesstring
à considérer comme une chaîne avec GNUexpr
.expr "$a" - 0
Fonctionnerait mieux).-12
c'est un entier valide, et a9999999999999999999
donné un débordement.Voici une fonction simple utilisant la même méthode que la réponse de muru :
Exemple:
Production:
la source