web-dev-qa-db-fra.com

Vérifier si un numéro d'entrée est un entier

J'essaie de vérifier si une entrée est un entier et je l'ai parcouru cent fois, mais je ne vois pas l'erreur ici. Hélas, cela ne fonctionne pas, il déclenche l'instruction if pour toutes les entrées (chiffres/lettres)

read scale
if ! [[ "$scale" =~ "^[0-9]+$" ]]
        then
            echo "Sorry integers only"
fi

J'ai joué avec les citations mais soit je l'ai raté, soit ça n'a rien fait. Qu'est-ce que je fais mal? Existe-t-il un moyen plus simple de tester si une entrée n'est qu'un INTEGER?

37
lonewarrior556

Supprimer les devis

if ! [[ "$scale" =~ ^[0-9]+$ ]]
    then
        echo "Sorry integers only"
fi
33
jimmij

Utilisation -eq opérateur de test commande:

read scale
if ! [ "$scale" -eq "$scale" ] 2> /dev/null
then
    echo "Sorry integers only"
fi

Il fonctionne non seulement dans bash mais aussi dans n'importe quel shell POSIX. De la documentation POSIX test :

n1 -eq  n2
    True if the integers n1 and n2 are algebraically equal; otherwise, false.
19
cuonglm

Comme l'OP ne semble vouloir que des entiers positifs:

[ "$1" -ge 0 ] 2>/dev/null

Exemples:

$ is_positive_int(){ [ "$1" -ge 0 ] 2>/dev/null && echo YES || echo no; }
$ is_positive_int Word
no
$ is_positive_int 2.1
no
$ is_positive_int -3
no
$ is_positive_int 42
YES

Notez qu'un seul [ un test est requis:

$ [[ "Word" -eq 0 ]] && echo Word equals zero || echo nope
Word equals zero
$ [ "Word" -eq 0 ] && echo Word equals zero || echo nope
-bash: [: Word: integer expression expected
nope

En effet, le déréférencement se produit avec [[:

$ Word=other
$ other=3                                                                                                                                                                                  
$ [[ $Word -eq 3 ]] && echo Word equals other equals 3
Word equals other equals 3
8
Tom Hale

Pour les entiers non signés, j'utilise:

read -r scale
[ -z "${scale//[0-9]}" ] && [ -n "$scale" ] || echo "Sorry integers only"

Tests:

$ ./test.sh
7
$ ./test.sh
   777
$ ./test.sh
a
Sorry integers only
$ ./test.sh
""
Sorry integers only
$ ./test.sh

Sorry integers only
8
raciasolvo
( scale=${scale##*[!0-9]*}
: ${scale:?input must be an integer}
) || exit

Cela vérifie et génère votre erreur.

3
mikeserv

Veuillez vérifier Comment puis-je tester si une variable est un nombre dans Bash page stackoverflow. Cette page a d'autres bonnes façons de vérifier le nombre entier.

2
Reza Harasani

Une solution POSIX et portable est:

read scale
if     [ -z "${scale##*[!0-9]*}" ]; 
then   echo "Sorry integers only"
fi
0
Isaac