IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[Script Bash] Tester si $1 est numérique


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier Avatar de COGAN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 109
    Points : 116
    Points
    116
    Par défaut [Script Bash] Tester si $1 est numérique
    Salut à tous,
    Dans un script Bash, connaissez-vous une méthode pour tester si le paramètre $1 (ou autre variable) est de type numérique (entier) ?

  2. #2
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if  [ $(echo $i | grep -v [a-Z] | wc -l) -gt 1 ]; then ........ ; fi

  3. #3
    Membre régulier Avatar de COGAN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 109
    Points : 116
    Points
    116
    Par défaut
    Merci pour l'idée, juste une petite adaptation (le résultat est soit "0", soit "1", jamais supérieur à "1") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #...............................................................................
    # Tester un nombre entier positif ou nul et sortir (exit) s'il ne l'est pas.
    # Parametre 1 : valeur a tester
    # Parametre 2 : message d'erreur a afficher (facultatif)
    # Exit : 1, la valeur est incorrecte
    #...............................................................................
    TestEntierPositifNulExit() {
        if  [ $(echo $1 | grep -v [a-Z] | wc -l) -eq 0 ]; then
            if [ "($2)" = "()" ]; then
                echo "Erreur : valeur $1 non entiere positive ou nulle !"
            else
                echo $2
            fi
            exit 1
        fi
    }

  4. #4
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par COGAN
    Salut à tous,
    Dans un script Bash, connaissez-vous une méthode pour tester si le paramètre $1 (ou autre variable) est de type numérique (entier) ?

    Syntaxe valable en ksh et en bash
    Pour le bash, l'option extglob doit être active :
    shopt -s extglob

    http://marcg.developpez.com/ksh/#L4.2 ( 4.3. Les expressions )


    Gestion des entiers non signés :

    if [[ $var = +([0-9]) ]] ; then
    echo "* numerique"
    else
    echo "*** non numerique"
    fi



    Gestion des entiers signés :

    if [[ $var = ?([-+])+([0-9]) ]] ; then
    echo "* numerique"
    else
    echo "*** non numerique"
    fi
    Loi de Murphy:
    La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
    La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
    Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.

  5. #5
    Membre éclairé Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Points : 781
    Points
    781
    Par défaut
    Autre solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $var=$1
    [ $var -eq 0 ] 2>/dev/null
    if [ $? -eq 0 -o $? -eq 1 ]
    then 
      echo "c'est un entier"
    else
      echo "c'est pas un entier"
    fi
    petite explication :
    On utilise le code de retour de la première comparaison, O = vrai et 1 = faux, un autre code, c'est que le test s'est planté, donc que la variable n'est pas un entier.

    ++
    Two beer or not two beer. (Shakesbeer)
    Question technique par MP => poubelle!

  6. #6
    Membre régulier Avatar de COGAN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 109
    Points : 116
    Points
    116
    Par défaut
    Merci à tous !
    Ce post m'a sensibilisé encore davantage à l'utilisation des scripts !

  7. #7
    Membre habitué Avatar de gKsam
    Profil pro
    Inscrit en
    Août 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 166
    Points : 153
    Points
    153
    Par défaut juste pour la route
    bonjour,

    j'ai créé deux méthodes. (BASH >= 4.4environ)

    un méthode variable__is_int qui vérifie si la variable est de type entier ce qui je pense répond à la question.

    ensuite une deuxième méthode value__is_int qui vérifie si la valeur est la valeur d'un entier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    variable__is_int () {
     
        local -i return_code=1
     
        if [[ ${#@} -eq 1 && -n "${1}" ]]; then
     
            local -n _value=${1}
     
            if [[ -R _value && "$(declare -p ${1})" =~ 'declare -i' ]]; then
     
                return_code=0
     
            fi
     
        fi
     
        return ${return_code}
     
    } 2>>/dev/null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    value__is_int () {
     
        local -i return_code=1
     
        if [[ ${#@} -eq 1 && -n "${1}" ]]; then
     
            printf '%d' "${1}"
     
            if [[ ${?} -ne 0 ]]; then
     
                local -n _value=${1}
     
                if [[ -R _value ]]; then
     
                    if [[ -v _value ]]; then
     
                        printf '%d' "${_value}"
     
                        if [[ ${?} -eq 0 ]]; then
     
                            return_code=0
     
                        fi
     
                    elif [[ "$(declare -p ${1})" =~ 'declare -i' ]]; then
     
                        return_code=0
     
                    fi
     
                fi
     
            else
     
                return_code=0
     
            fi
     
        fi
     
        return ${return_code}
     
    } &> /dev/null
    cela utilise un printf '%d' pour vérifier si une valeur est bien en entier (ici un entier signé)

    pour vérifier le type, cela tente de faire une référence de nom du paramètre (vérifier que c'est bien une variable et non une valeur) ensuite cela compare declare -p de la variable avec celle d'un entier declare -i.
    Le plus compliqué, c'est de faire quelque chose de simple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tester si une valeur est numérique dès la saisie
    Par sandrine49 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/06/2008, 17h23
  2. tester une chaine pour savoir si elle est numérique ?
    Par _MattU_ dans le forum VBA Access
    Réponses: 4
    Dernier message: 02/06/2008, 15h47
  3. [bash] Tester si un dossier est vide
    Par coincoin22 dans le forum Shell et commandes GNU
    Réponses: 22
    Dernier message: 30/07/2007, 19h19
  4. [PL/SQL] Tester si valeur est de type numérique
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 23/10/2006, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo