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 :

Comparaison d'un nombre entier dans une boucle If


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Comparaison d'un nombre entier dans une boucle If
    Bonjour ,

    Je cherche à comparer un nombre entier que je récupère d'une requête SNMP ( ici la température d'un onduleur ) , je stock cette valeurs dans un fichier texte afin de pouvoir isoler la valeur .

    Cependant lorsque j'essaye de la faire passer dans ma boucle If , j'ai l'impression qu'il ne prend pas en compte la valeurs .
    Malgré que je change la valeurs de la première condition il me retourne automatiquement Température normal

    température.sh :
    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
    #!/bin/bash
     
    info_brut=$(snmpwalk -Os -c $1 -v $2 $3 .1.3.6.1.4.1.3808.1.1.1.2.2.3.0)
    snmpwalk -Os -c public -v 1 xxx.xxx.xxx.xxx .1.3.6.1.4.1.3808.1.1.1.2.2.3.0 > résultat.txt
     
    if (egrep -o '[[:digit:]]*$'./résultat.txt <<< 20) ; then
            echo "Température haute"
            exit 1
    elif (egrep -o '[[:digit:]]*$'./résultat.txt <<< 30) ; then
            echo "Température trop haute"
            exit 2
    else
            echo "Température normal"
            exit 0
    fi
    Résultat.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enterprises.3808.1.1.1.2.2.3.0 = Gauge32: 25
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [root@SRV-SUPER-01 custom]# ./température.sh public 1 xxx.xxx.xxx.xxx
    enterprises.3808.1.1.1.2.2.3.0 = Gauge32: 25
    Température normal
    Peut être que un avis extérieur pourrait m’éclaircir les idées ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Tu ne peux pas récupérer ta valeur comme tu l'as fait. Et puis ce n'est pas très rentable de faire deux fois l'extraction de chaine depuis ton fichier.
    Enfin, l'opérateur de comparaison n'est pas celui que tu as utilisé;

    Tu pourrais faire comme ça, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    myvar=$(egrep -o '[[:digit:]]*$'./résultat.txt)
     
    if [[ $myvar -lt 20 ]] ; then
            echo "Température haute"
            exit 1
    elif (( myvar < 30 )) ; then
            echo "Température trop haute"
            exit 2
    else
            echo "Température normal"
            exit 0
    fi
    Remarque : si ton fichier ne comprend pas la valeur numérique attendue, tu devrais rencontrer une erreur de syntaxe
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Je viens d'essayer avec ton code cependant je ne récupère rien , j'ai l'impression qu'il n'arrive pas à accéder au fichier résultat.txt cette fois-ci .

    température.sh :

    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
    #!/bin/bash
     
    snmpwalk -Os -c $1 -v $2 $3 .1.3.6.1.4.1.3808.1.1.1.2.2.3.0 > résultat.txt
     
    myvar=$(egrep -o '[[:digit:]]*$'./résultat.txt)
     
    if [[ $myvar -lt 20 ]] ; then
            echo "Température haute"
            exit 1
    elif (( $myvar < 30 )) ; then
            echo "Température trop haute"
            exit 2
    else
            echo "Température normal"
            exit 0
    fi

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Eurêka
    Après avoir bidouiller ton code , je me suis rendu compte que le soucis venait du chemin pour accéder au fichier résultat.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myvar=$(egrep -o '[[:digit:]]*$'./résultat.txt)
    Juste avec un petit changement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myvar=$(egrep -o '[[:digit:]]*$' résultat.txt)
    Le code fonctionne , merci beaucoup à toi

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Salut,
    Il n' y a pas besoin du fichier résultat.txt ni de egrep.
    Comme dans le message 1 https://www.developpez.net/forums/d1.../#post10295976
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    info_brut=$(snmpwalk -Os -c $1 -v $2 $3 .1.3.6.1.4.1.3808.1.1.1.2.2.3.0)
    puis pour recuperer la valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "${info_brut##* }"
    comme stipulé par al1_24, tu dois vérifier que tu obtiens bien une valeur.
    snmpwalk retourne certainement un code d'erreur dans $?
    Cordialement.

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Citation Envoyé par Phi.n94 Voir le message
    Après avoir bidouiller ton code , je me suis rendu compte que le soucis venait du chemin pour accéder au fichier résultat.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myvar=$(egrep -o '[[:digit:]]*$'./résultat.txt)
    Juste avec un petit changement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myvar=$(egrep -o '[[:digit:]]*$' résultat.txt)
    Le code fonctionne , merci beaucoup à toi
    Pour ceux qui se posent la question, la correction ne vient pas de la suppression du chemin mais de l'ajout d'une espace !
    Précédemment, ./resultat.txt faisait partie de l'expression régulière de grep.
    Il FAUT une espace.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Non je n'ai aucun code d'erreur lorsque je récupère la valeur $

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Salut,
    Ce que je voulais dire, c'est qu'on peut tester le code de retour de snmpwalk dans $?
    Un petit exemple vaut mieux qu'un long discours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    letest() {
    	if [ 0 -eq $(($RANDOM % 2)) ] ; then
    		echo "ok"
    		return 0
    	else
    		echo "bad"
    		return 1
    	fi
    	}
    var="$(letest)"
    echo $?
    echo "$var"
    Cordialement.

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Phi.n94 Voir le message
    Je viens d'essayer avec ton code température.sh :

    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
    #!/bin/bash
     
    snmpwalk -Os -c $1 -v $2 $3 .1.3.6.1.4.1.3808.1.1.1.2.2.3.0 > résultat.txt
     
    myvar=$(egrep -o '[[:digit:]]*$'./résultat.txt)
     
    if [[ $myvar -lt 20 ]] ; then
            echo "Température haute"
            exit 1
    elif (( $myvar < 30 )) ; then
            echo "Température trop haute"
            exit 2
    else
            echo "Température normal"
            exit 0
    fi
    Je me sens juste un peu perplexe quant au sens des tests et des messages.

    D'après ce que je lis et si je ne m'abuse:
    • lorsque la température est inférieure à 20, elle est décrite comme "Température haute"
    • lorsque la température est comprise entre 20 et 30, elle est décrite comme "Température trop haute"
    • lorsque la température est supérieure à 30, elle est décrite comme "Température normale"


    Est-il bien normal (sans "e", ce coup-ci) qu'une température supérieure à une température trop haute soit considérée comme normale (avec un "e"...) ???

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Il s'agissait d'un exemple pour illustrer mon problème , la valeur de mon If n'était pas prise en compte correctement .

    Le code "final" ressemble à ça :

    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
    #!/bin/bash
     
    info_brut=$(snmpwalk -Os -c $1 -v $2 $3 .1.3.6.1.4.1.3808.1.1.1.2.2.3.0)
    echo "${info_brut##* }"
     
    if [[ "${info_brut##* }" > 35 ]] ; then
            echo "Température haute"
            exit 1
    elif [[ "${info_brut##* }" > 45 ]] ; then
            echo "Température trop haute"
            exit 2
    else
           echo "Température  normal"
            exit 0
    fi
    Le code me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [root@SRV-SUPER-01 custom]# ./température.sh public 1 xxx.xxx.xxx.xxx
    25
    Température  normal

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Phi.n94 Voir le message
    Il s'agissait d'un exemple pour illustrer mon problème , la valeur de mon If n'était pas prise en compte correctement .
    Ok. Je comprends... mais... (voir la suite)

    Le code "final" ressemble à ça :

    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
    #!/bin/bash
     
    info_brut=$(snmpwalk -Os -c $1 -v $2 $3 .1.3.6.1.4.1.3808.1.1.1.2.2.3.0)
    echo "${info_brut##* }"
     
    if [[ "${info_brut##* }" > 35 ]] ; then
            echo "Température haute"
            exit 1
    elif [[ "${info_brut##* }" > 45 ]] ; then
            echo "Température trop haute"
            exit 2
    else
           echo "Température  normal"
            exit 0
    fi
    Le code me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [root@SRV-SUPER-01 custom]# ./température.sh public 1 xxx.xxx.xxx.xxx
    25
    Température  normal
    Hum... As-tu réellement testé ton code avec une valeur supérieure à 45 ?

    Je t'invite à le faire ou à relire ton algorithme...

    Et je te rappelle que l'adjectif "normal" peut aussi s'accorder avec le nom qu'il qualifie (mais ce n'est pas la source du bug!).

  12. #12
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    L'opérateur > sert à comparer des chaines de caractères. Pour comparer des valeurs numériques, il faut utiliser l'opérateur -gt
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    L'opérateur > sert à comparer des chaines de caractères. Pour comparer des valeurs numériques, il faut utiliser l'opérateur -gt
    Oui!

    Ça peut vraiment être un bug ici si le nombre de chiffres des valeurs en écriture décimale peut varier.

    Par exemple, 10 peut sembler plus ou moins plus grand que 2 (sic!):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ if [[ 10 > 2 ]]; then echo ok; else echo bug; fi
    bug
     
    $ if [[ 10 -gt 2 ]]; then echo ok; else echo bug; fi
    ok

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

Discussions similaires

  1. Trouver un nombre entier dans une colonne
    Par k4lls dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/01/2012, 04h13
  2. [PHP 5.2] Nombre générer un nombre aléatoire dans une boucle
    Par link.80 dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2011, 08h26
  3. [Débutant] Nombre "n" dans une boucle.
    Par alexov dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/09/2011, 10h07
  4. Formule pour déduire des nombres pair dans une boucle
    Par Lekno dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/10/2010, 11h31
  5. [PHP 5.2] Additionner des nombres entiers dans une chaine de caractères
    Par lecaptain dans le forum Langage
    Réponses: 2
    Dernier message: 23/10/2009, 12h12

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