Comment vérifier si une variable est un nombre ou contient un nombre dans un shell UNIX?
if echo $var | egrep -q '^[0-9]+$'; then
# $var is a number
else
# $var is not a number
fi
Les variables shell n'ayant pas de type, le moyen le plus simple consiste à utiliser le type de retour test
:
if [ $var -eq $var 2> /dev/null ]; then ...
(Ou alors le parser avec une expression rationnelle)
Pas de fourches, pas de tuyaux. Pure POSIX Shell:
case $var in
(*[!0-9]*|'') echo not a number;;
(*) echo a number;;
esac
(Suppose nombre: = une chaîne de chiffres ). Si vous souhaitez également autoriser les numéros signés avec un seul -
ou +
interligne, supprimez le signe facultatif comme suit:
case ${var#[-+]} in
(*[!0-9]*|'') echo not a number;;
(*) echo a number;;
esac
Dans ksh93 ou bash avec l'option extglob activée:
if [[ $var == +([0-9]) ]]; then ...
Je suis un peu novice dans la programmation de Shell, alors j'essaie de trouver le moyen le plus facile et le plus lisibleIl vérifiera simplement si le var est supérieur ou égal à 0 pas quoi que ce soit ...:
if [ $var -ge 0 2>/dev/null ] ; then ...
Voici une version utilisant uniquement les fonctionnalités disponibles dans un shell sans système d'exploitation (c'est-à-dire que cela fonctionnerait avec sh
), et avec un processus de moins que d'utiliser grep
:
if expr "$var" : '[0-9][0-9]*$'>/dev/null; then
echo yes
else
echo no
fi
Ceci vérifie que le $var
représente seulement un entier; ajustez l'expression rationnelle à votre goût et notez que l'argument expr
regexp est implicitement ancré au début.
if echo "$var" | egrep -q '^\-?[0-9]+$'; then
echo "$var is an integer"
else
echo "$var is not an integer"
fi
tests (avec var = 2 etc.):
2 is an integer
-2 is an integer
2.5 is not an integer
2b is not an integer
if echo "$var" | egrep -q '^\-?[0-9]*\.?[0-9]+$'; then
echo "$var is a number"
else
echo "$var is not a number"
fi
tests (avec var = 2 etc.):
2 is a number
-2 is a number
-2.6 is a number
-2.c6 is not a number
2. is not a number
2.0 is a number
Ceci peut être vérifié en utilisant une expression régulière.
###
echo $var|egrep '^[0-9]+$'
if [ $? -eq 0 ]; then
echo "$var is a number"
else
echo "$var is not a number"
fi
Vous pouvez le faire avec une simple commande de test.
$ test ab -eq 1 >/dev/null 2>&1
$ echo $?
2
$ test 21 -eq 1 >/dev/null 2>&1
$ echo $?
1
$ test 1 -eq 1 >/dev/null 2>&1
$ echo $?
0
Donc, si le statut de sortie est 0 ou 1, il s'agit d'un entier, mais si le statut existant est 2, il ne s'agit pas d'un nombre.
En prenant la valeur de la ligne de commande et en affichant THE INPUT IS DECIMAL/NON-DECIMAL et NUMBER ou non:
NUMBER=$1
IsDecimal=`echo "$NUMBER" | grep "\."`
if [ -n "$IsDecimal" ]
then
echo "$NUMBER is Decimal"
var1=`echo "$NUMBER" | cut -d"." -f1`
var2=`echo "$NUMBER" | cut -d"." -f2`
Digit1=`echo "$var1" | egrep '^-[0-9]+$'`
Digit2=`echo "$var1" | egrep '^[0-9]+$'`
Digit3=`echo "$var2" | egrep '^[0-9]+$'`
if [ -n "$Digit1" ] && [ -n "$Digit3" ]
then
echo "$NUMBER is a number"
Elif [ -n "$Digit2" ] && [ -n "$Digit3" ]
then
echo "$NUMBER is a number"
else
echo "$NUMBER is not a number"
fi
else
echo "$NUMBER is not Decimal"
Digit1=`echo "$NUMBER" | egrep '^-[0-9]+$'`
Digit2=`echo "$NUMBER" | egrep '^[0-9]+$'`
if [ -n "$Digit1" ] || [ -n "$Digit2" ]; then
echo "$NUMBER is a number"
else
echo "$NUMBER is not a number"
fi
fi
Voici le test sans aucune expression rationnelle (code tcsh):
Créer un numéro de contrôle de fichier:
if ( "$*" == "0" ) then
exit 0 # number
else
((echo "$*" | bc) > /tmp/tmp.txt) >& /dev/null
set tmp = `cat /tmp/tmp.txt`
rm -f /tmp/tmp/txt
if ( "$tmp" == "" || $tmp == 0 ) then
exit 1 # not a number
else
exit 0 # number
endif
endif
et courir
chmod +x checknumber
Utilisation
checknumber -3.45
et vous aurez le résultat sous la forme errorlevel ($?).
Vous pouvez l'optimiser facilement.
if echo $var | egrep -q '^[0-9]+$'
En réalité, cela ne fonctionne pas si var est multiligne.
c'est à dire
var="123
qwer"
Surtout si var provient d'un fichier:
var=`cat var.txt`
C'est le plus simple:
if [ "$var" -eq "$var" ] 2> /dev/null
then echo yes
else echo no
fi
( test ! -z $num && test $num -eq $num 2> /dev/null ) && {
# $num is a number
}