[Shell] Tester une variable numérique
Publié par jipicy, dernière mise à jour mar. 03 avr. 2007 à 21:27:02 par jipicy
Tester une variable numérique
Préambule
Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères".
De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à fait vrai, mais nous verrons ça en fin d'article).
Donc jusqu'à présent il fallait user de petites astuces plus ou moins "alambiquées" pour parvenir à définir si oui ou non une variable était de type "entier".
Sommaire
Exemples de tests
grep
sed
expr
test
Variable de type entier
Remerciement
Exemples de tests
En voici trois faisant appel respectivement à la commande "grep", à la commande "expr" et à la commande "test" couplée à certaines instructions de contrôle comme le code retour d'une commande.
Note : Dans les exemples suivants, nous considèrerons que la variable "$var" est initialisée d'après le paramètre "$1" passé directement sur la ligne de commande à la suite de l'appel de chaque script.
Retour sommaire
grep
Note : Dans l'exemple qui suit, l'expression "[ [:digit:] ]" doit s'écrire sans les espaces entres les double-crochets.
#!/bin/bash
# script_grep.sh
var=$1
if [ "$(echo $var | grep "^[ [:digit:] ]*$")" ]
then
echo "La chaîne est numérique"
fi
Retour sommaire
expr
Évaluation du code retour (ici dans la variable "$statut") après un test sur une opération arithmétique à l'aide de la commande "expr".
#!/bin/sh
# script_expr.sh
var=$1
expr $var + 0 1>/dev/null 2>&1
statut=$?
if test $statut -lt 2
then
echo "$var" numérique
fi
Retour sommaire
test
On évalue à l'aide de la commande "test" (représentée ici par les crochets "[" et "]") si la valeur de la variable "$var" est égale à zéro (0), puis on évalue le code retour ($?) pour ses 2 états de sortie (vrai ou faux, autrement dit 0 ou 1), qui dans un cas comme dans l'autre serait donc de type entier. Dans tout autre cas, code retour supérieur à 1, échec de l'évaluation.
#!/bin/bash
# script_test.sh
var=$1
[ $var -eq 0 ] 2> /dev/null
if [ $? -eq 0 -o $? -eq 1 ]
then
echo "La chaîne est numérique"
fi
Retour sommaire
Variable de type "entier"
Comme souligné en tout début d'article, il est tout a fait possible d'initialiser une variable de type "entier" grâce au shell "POSIX".
La création d'une variable de type entier doit au préalable être déclarée à l'aide de la commande "typeset -i" ou "let".
Voici donc un exemple implémentant la commande "let" pour déterminer si une variable est bien de type "entier"
#!/bin/sh
# script_let.sh
var=$1
if let $var 2>/dev/null
then
echo "$var numérique"
else
echo "$var non numérique"
fi
Noter que la ligne "if let $var 2>/dev/null" aurait très bien pu s'écrire sous l'une ou l'autre de ces formes : if let var 2>/dev/nullou if ((var)) 2>/dev/null
Retour sommaire
Remerciement
Je tiens à remercier lami20j pour son astuce avec la commande "expr" et surtout pour la déclaration de variable de type entier.