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?
Supprimer les devis
if ! [[ "$scale" =~ ^[0-9]+$ ]]
then
echo "Sorry integers only"
fi
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.
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
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
( scale=${scale##*[!0-9]*}
: ${scale:?input must be an integer}
) || exit
Cela vérifie et génère votre erreur.
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.
Une solution POSIX et portable est:
read scale
if [ -z "${scale##*[!0-9]*}" ];
then echo "Sorry integers only"
fi