web-dev-qa-db-fra.com

Vérifier qu'une variable est un nombre dans un shell UNIX

Comment vérifier si une variable est un nombre ou contient un nombre dans un shell UNIX?

20
Gregor
if echo $var | egrep -q '^[0-9]+$'; then
    # $var is a number
else
    # $var is not a number
fi
22
Adam Rosenfield

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)

16
Piotr Lesnicki

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
12
Jens

Dans ksh93 ou bash avec l'option extglob activée:

if [[ $var == +([0-9]) ]]; then ...
3
Darron

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 ...
1
Johnney Jung

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.

1
Norman Gray

ENTIER

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

NOMBRE

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
1
Oguz

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
1
Wasim

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.

0

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
0
Pritam Chatterjee

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.

0
khitron
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
0
Vouze
( test ! -z $num && test $num -eq $num 2> /dev/null ) && {
   # $num is a number
}
0
cab404