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 :

Les chiffres significatifs


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut Les chiffres significatifs
    Bonjour,

    Je bute sur un problème où je veux obtenir seulement deux chiffres après la virgule.

    Voici mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #On va chercher la valeur
    val=$( ./bacrp $AUTOMATE $OBJECT $IDENTIFIER 85)
    echo val = $val
     
     
    #Chiffre après la virgule
    valeur=$(printf "%.2f" $val)
    echo valeur = $valeur

    Voici ce que me retourne le script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    + val=$'9.920000\r'
    + echo val = $'9.920000\r'
    val = 9.920000
    ++ printf %.2f $'9.920000\r'
    : nombre non valableintf: 9.920000
    + valeur=0,00
    + echo valeur = 0,00
    valeur = 0,00
    Pouvez-vous m'expliquer d'où vient mon erreur svp

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Bonjour,

    Selon moi, tu as un souci entre l'utilisation du point "." pour une virgule "," ou vice versa.
    Cordialement.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Bonjour,

    Pouvez-vous m'expliquer d'où vient mon erreur svp
    ce n'est pas toi, c'est bacrp, qui commet deux erreurs
    • finir ses lignes avec \r
    • utiliser un point comme séparateur décimal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /cheminAbsolu/bacrp $AUTOMATE $OBJECT $IDENTIFIER 85| sed 's/\r//; s/\./,/'
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour

    utiliser un point comme séparateur décimal
    De toute façon, bash ne connaît que les nombres entiers. N'est-ce pas ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    oui, et non : bash ne fait pas de calculs sur les nombres décimaux, mais la builtin printf peut les formater en fonction de la locale.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Effectivement N_BaH, le bout de code fonctionne parfaitement

    J'ai un dernier petit problème, je souhaite comparer ma valeur et afficher une sortie différente selon le seuil franchit mais j'ai un petit problème sur ma sortie :/

    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
     
    #On va chercher la valeur
    val=$(/tmp/bacnet-stack-0.8.3/bin/bacrp $AUTOMATE $OBJECT $IDENTIFIER 85| sed 's/\r//; s/\./,/')
    unity=$( ./bacrp $AUTOMATE $OBJECT $IDENTIFIER 117)
     
    #Chiffres significatifs
    valeur=$(printf "%.2f" $val)
     
    #Condition et sortie nagios
    if [ "$valeur" >= "$CRIT" ];then
            echo "Valeur = "$valeur" "$unity" | $unity=$valeur;$WARN;$CRIT;0;$MAX" && exit 2
    elif [ "$valeur" >= "$WARN" ] && [ "$valeur" < "$CRIT" ];then
            echo "Valeur = "$valeur" "$unity" | $unity=$valeur;$WARN;$CRIT;0;$MAX" && exit 1
    else
            echo "Valeur = "$valeur" "$unity" | $unity=$valeur;$WARN;$CRIT;0;$MAX" && exit 0
    fi
    Cependant, je n'obtiens pas le résultat escompté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ++ /tmp/bacnet-stack-0.8.3/bin/bacrp 2098183 0 1 85
    + val=22,600000
    ++ ./bacrp 2098183 0 1 117
    + unity=$'degrees-celsius\r'
    ++ printf %.2f 22,600000
    + valeur=22,60
    + '[' 22,60 400 ']'
    test.sh: line 38: [: 22,60 : opérateur unaire attendu
    + '[' 22,60 300 ']'
    test.sh: line 40: [: 22,60 : opérateur unaire attendu
    =22,60;300;400;0;500'0 degrees-celsius
    =22,60;300;400;0;500es-celsius
    + exit 0
    J'aimerai pouvoir obtenir une sortie comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "Valeur = "$valeur" "$unity" | $unity=$valeur;$WARN;$CRIT;0;$MAX"
    mais on me retourne cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =22,60;300;400;0;500es-celsius

  7. #7
    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
    Bash ne traite que les entiers, et encore...

    Pour comparer 2 entiers, il faut utiliser "test":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if test "$valeur" -ge "$CRIT"; then
    qui peut être abrégé avec les crochets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ "$valeur" -ge "$CRIT" ]; then
    Mais, pour les flottants, il faut utiliser autre chose, comme "bc" (man bc)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (( $(echo "$valeur >= $CRIT" | bc -l) )); then

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Merci pour ces informations mais une question me vient en tête comment faire pour évaluer deux conditions, car j'ai essaie mais cela ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    elif (( $(echo "$valeur >= $WARN" && "$valeur < $CRIT" | bc -l) ));then
    elif (( $(echo "$valeur >= $WARN" | bc -l) && $(echo "$valeur < $CRIT" | bc -l) ));then
    Aussi, avez-vous une réponse à m'apporter concernant la sortie "étrange" que me délivre le script ?

  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
    Pourquoi ne pas chercher un peu soi-même?
    Par essais et erreurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (( $(echo "$CRIT > $valeur && $valeur >= $WARN" | bc -l) )); then
    Edit (merci jiliagre): Oops! C-c/C-v malheureux...
    Edit (merci Flodelarab): Oops! "bc" ne comprend pas d'opérateur de comparaison ternaire...

  10. #10
    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 musha76 Voir le message
    J'aimerai pouvoir obtenir une sortie comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "Valeur = "$valeur" "$unity" | $unity=$valeur;$WARN;$CRIT;0;$MAX"
    mais on me retourne cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =22,60;300;400;0;500es-celsius
    Je ne comprends pas quelle sortie tu veux.

    Il n'est pas nécessaire de mettre plein de guillemets.
    Il vaut mieux mettre un seul argument de "echo", avec une seule paire de guillemets, comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "Valeur = $valeur $unity | $unity=$valeur;$WARN;$CRIT;0;$MAX"

  11. #11
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... $CRIT > $valeur >= $CRIT ...
    ɹǝsn *sıɹɐlos*

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ "$valeur" >= "$CRIT" ];then
    Pas bien. La comparaison est lexicographique. Pas numérique.
    02 >= 01 mais 02 < 1

    La bonne formulation est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     test "$valeur" -ge "$CRIT"
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     [ "$valeur" -ge "$CRIT" ]
    comment faire pour évaluer deux conditions
    Comme pour enchaîner deux commande puisque les crochets ne sont que l'abréviation de "test":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test 1 -eq 1 && test 2 -eq 2 && echo OK
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ 1 -eq 1 ] && [ 2 -eq 2 ] && echo OK

    Je voudrais bien répondre sur la question du format de sortie mais je n'ai toujours pas compris la sortie de bacrp.
    Peux-tu donner un exemple de sortie de bacrp et un exemple de présentation souhaitée ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  13. #13
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    D'abords merci pour vos réponses!

    Concernant la boucle je suis parti sur un fonctionnement simpliste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (( $(echo "$valeur >= $CRIT" | bc -l) ));then
            echo "Critical"
    elif (( $(echo "$CRIT > $valeur >= $WARN" | bc -l) ));then
            echo "Warning"
    else
            echo "OK"
    fi
    Cependant la sortie est toujours OK, même lorsque la valeur est comprise entre CRIT et WARN ou au dessus de CRIT

    La comparaison est faite bizarrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ++ printf %.2f 10,469999
    + valeur=10,47
    ++ echo '10,47 >= 30'
    ++ bc -l
    (standard_in) 1: syntax error
    + ((    ))
    ++ echo '30 > 10,47 >= 20'
    ++ bc -l
    (standard_in) 1: syntax error
    + ((    ))
    + echo OK
    OK


    Concernant l'exécution de la commande bacrp voici sa sortie brute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./bacrp 2098183 0 1 85
    Registering with BBMD at X.X.X.X:47808 for 60000 seconds
    22.519999
    Pour informations, avec le dernier nombre 85 je récupère ma valeur et en remplacent 85 par 117, j'obtiens l'unité de ma valeur.

    Je récupère mes valeurs et les traitent via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #On va chercher la valeur
    val=$(/tmp/bacnet-stack-0.8.3/bin/bacrp $AUTOMATE $OBJECT $IDENTIFIER 85| sed 's/\r//; s/\./,/')
    unity=$( ./bacrp $AUTOMATE $OBJECT $IDENTIFIER 117)
     
     
    #Chiffres significatifs
    valeur=$(printf "%.2f" $val)
    Je développe un plugin pour nagios (supervision réseau) donc je compare ma valeur récupérée à plusieurs seuils ($CRIT & $WARN).
    Pour que le plugin fonctionne il faut avoir une sortie du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ‘label’=value[UOM];[warn] ;[crit];[min];[max]
    que j'essaie de reproduire via ma sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "Valeur = $valeur $unity | $unity=$valeur;$WARN;$CRIT;0;$MAX"
    Mais finalement, lorsque je lance mon script j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    =22,42;200;400;0;500'2 degrees-celsius
    =22,42;200;400;0;500es-celsius
    + exit 0
    Voila, j'ai essayé d'être le plus compréhensif possible

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ++ echo '10,47 >= 30'
    ++ bc -l
    (standard_in) 1: syntax error
    bc n'accepte, lui, que le point comme séparateur décimal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ echo '10.47>=30' | bc -l
    0
    $ (( $(echo '10.47>=30' | bc -l) )) && echo succès || echo erreur
    erreur
    $ echo '10.47<=30' | bc -l
    1
    $ (( $(echo '10.47<=30' | bc -l) )) && echo succès || echo erreur
    succès
    tu noteras que les valeurs retournées par bcsont inversées par rapport à ce qu'interprète bash.
    en effet,
    pour bash, l'évaluation arithmétique de 0 signifie "erreur", et l'évaluation de 1 veut dire "succés".

    edit: raturage de grand n'importe quoi.
    « les valeurs retournées par bcsont inversées par rapport à » ce que serait le code retour ( $? ?= 0 => succès, ?= 1 => erreur. mais bc ne retourne "erreur" que si il y a une erreur dans l'énoncé.)
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Ce qui est bien c'est que ce n'est pas du coup compliqué

    Alors reprenons, pour la substitution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #Transformation , en . pour les nombres decimaux
    valeur=$(echo $chiffre | sed "s/\,/./g")
    Par contre j'ai toujours un problème avec ma boucle...
    Je peux obtenir les seuils OK et CRITICAL mais pas WARNING et je ne comprends pas mon erreur car même dans le débug l'opération effectuée est cohérente.

    Pour ce qui est de ma boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #Condition 
    if (( $(echo "$valeur > $CRIT" | bc -l) ));then
            echo "Critical - valeur=$valeur - critical=$CRIT"
    elif (( $(echo "$CRIT > $valeur >= $WARN" | bc -l) ));then
            echo "Warning - valeur=$valeur - warning=$WARN - critical=$CRIT"
    else
            echo "OK - valeur=$valeur - warning=$WARN"
    fi

    Pour ce qui est du résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    + chiffre=10,50
    ++ echo 10,50
    ++ sed 's/\,/./g'
    + valeur=10.50
    ++ echo '10.50 > 20'
    ++ bc -l
    + ((  0  ))
    ++ echo '20 > 10.50 >= 5'
    ++ bc -l
    + ((  0  ))
    + echo 'OK - valeur=10.50 - warning=5'
    OK - valeur=10.50 - warning=5

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Concernant la boucle je suis parti sur un fonctionnement simpliste
    Question de point de vue. Moi, je trouve que tu te fais des nœuds au cerveau au contraire.

    Et puis tu ne lis pas ce qu'on t'écrit. Jilliagre t'as souligné le fait que la comparaison est un opérateur binaire ! Donc prenant 2 opérandes.
    Quand tu prends 3 opérandes pour en faire un encadrement comme à l'école, c'est nul. Pas un informaticien ne fait l'erreur.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  17. #17
    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 Flodelarab Voir le message
    Jilliagre t'as souligné le fait que la comparaison est un opérateur binaire ! Donc prenant 2 opérandes.
    Quand tu prends 3 opérandes pour en faire un encadrement comme à l'école, c'est nul. Pas un informaticien ne fait l'erreur.
    Oops! mea culpa! J'ai testé sur un exemple (trop) simple et cru que "bc" pouvait prendre un opérateur de comparaison ternaire (comme en lisp)!

    Il faut donc lier 2 tests binaires par un "et":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (( $(echo "$CRIT > $valeur && $valeur >= $WARN" | bc -l) )); then
    De plus, si tu enchaînes les tests avec des "elif", tu peux éviter de refaire les tests:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #Condition 
    if (( $(echo "$valeur > $CRIT" | bc -l) ));then
            echo "Critical - valeur=$valeur - critical=$CRIT"
    elif (( $(echo "$valeur >= $WARN" | bc -l) ));then
            echo "Warning - valeur=$valeur - warning=$WARN - critical=$CRIT"
    else
            echo "OK - valeur=$valeur - warning=$WARN"
    fi
    Cela dit, il faut que tu sois clair sur le comportement attendu lorsque $valeur est tout juste égale à $CRIT.

  18. #18
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Jilliagre t'as souligné le fait que la comparaison est un opérateur binaire ! Donc prenant 2 opérandes.
    Quand tu prends 3 opérandes pour en faire un encadrement comme à l'école, c'est nul. Pas un informaticien ne fait l'erreur.
    J'ai surtout réagi au fait que même en faisant abstraction de la syntaxe invalide, l'équation posée n'avait pas de solution mathématique et était donc toujours fausse.

    "$valeur" ne peut pas être à la fois "strictement supérieur à $CRIT" et aussi "inférieur ou égal au même $CRIT" ...
    ɹǝsn *sıɹɐlos*

  19. #19
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Juste une petite idée pour éviter bc :

    Déjà, si tu tournes en bash, printf peut directement mettre le résultat dans une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ printf -vvar1 "%.2f" 30,469999
    $ echo $var1 
    30,47
    Ensuite, la valeur significative est 2 chiffres après la virgule, donc si tu "multiplies" tes valeurs par 100, tu restes sur de l'entier.
    comment le simuler en bash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ printf -vvar1 "%.2f" 30,469999
    $ echo $var1
    30,47
    $ printf -vvar1 "%.0f" "${var1/,/}"
    $ echo $var1
    3047
    Pour revenir sur la valeur initial (donc diviser par 100):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ printf -vvar1 "%.2f" "${var1:0:$((${#var1}-2))},${var1:$((${#var1}-2)):2}"
    $ echo $var1
    30,47
    Et ceci fonctionne aussi avec des petites valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ printf -vvar1 "%.2f" 0,479999
    $ echo $var1
    0,48
    $ printf -vvar1 "%.0f" "${var1/,/}"
    $ echo $var1
    48
    $ printf -vvar1 "%.2f" "${var1:0:$((${#var1}-2))},${var1:$((${#var1}-2)):2}"
    $ echo $var1
    0,48
    Ici, on est dans ton cas bien particulier, dont on est sûr que le nombre est obligatoirement au format 2 chiffres après la virgule.
    Et plus besoin d'utiliser bc pour comparer (on est sur du built-in)...
    Cordialement.

  20. #20
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Merci pour toute cette aide.
    Le script fonctionne de cette manière et cela me convient.

    Cela dis, j'ai toujours ce problème de retour que je n'arrive pas à résoudre...

    Lorsque ma valeur dépasse le seuil critique j'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (( $(echo "$valeur > $CRIT" | bc -l) ));then
            echo " "$unity" = "$valeur" | $unity=$valeur;$WARN;$CRIT;0;$MAX "
    J'obtiens quelque chose de décousu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =10.47;5;10;0;25 s-celsius
    Après plusieurs tests, il semblerait que l’interpréteur n’apprécie pas le passage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "$unity" = "$valeur" | $unity=$valeur
    J'ai donc mis plusieurs echo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "$unity" && echo "=$valeur" && echo "| $unity" && echo "=$valeur;$WARN;$CRIT;0;$MAX"
    Donc j'obtiens bien ce que je veux mais sur plusieurs ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    degrees-celsius
    =11.07
    | degrees-celsius
    =11.07;5;10;0;25
    Soit sur une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    degrees-celsius=11.07 | degrees-celsius=11.07;5;10;0;25
    Mais même en passant avec des je n'obtiens pas le résultat que je veux (ligne du dessus)...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. extraire uniquement les chiffres d'une cellule
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/08/2017, 18h25
  2. un champ n'accepte que les chiffres....
    Par fadex dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 19/10/2005, 14h18
  3. xslt --> test sur les chiffres
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/09/2005, 13h17
  4. Algorithme pour chiffres significatifs en Assembleur
    Par lutin2003 dans le forum Assembleur
    Réponses: 5
    Dernier message: 09/09/2004, 10h47
  5. Recherche programme qui convertit les chiffres arabes en nb
    Par oli57 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 15/06/2002, 03h11

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