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 :

Test sur des numériques


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut Test sur des numériques
    bonjour,

    j'ai fait un script qui teste si un argument est numérique. il fonctionne mais comporte certain cas avec des message d'erreur et la est mon problème



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #/bin/sh
    var=$1 
    if [ $var -z ] 
    then echo -n Fournissez moi un argument s\'il vous plaît :; read var
    fi
    	expr $var + 0 1>/dev/null 2>&1 
    	statut=$?  
    		if test $statut -lt 2  
    			then  
    			echo "$var est numérique"  
    			else echo "$var n'est pas numérique"
    fi
    j'ai tester 3 cas
    1) celui ou je ne met rien - pas de soucis
    $ ./test2.sh
    Fournissez moi un argument s'il vous plaît :z
    z n'est pas numérique

    2)celui ou je met une valeur non numérique
    $ ./test2.sh z
    ./test2.sh: line 4: [: z : opérateur unaire attendu
    z n'est pas numérique

    3)celui ou je met un numérique
    $ ./test2.sh 12
    ./test2.sh: line 4: [: 12 : opérateur unaire attendu
    12 est numérique


    question peut être bête
    un numérique est forcément un nombre entier ?

    merci

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Bonjour,

    2éme post ou l'on te signal que la syntaxe est [ -z ... ] et non pas [ ... -z ]

    protège tes variables en les mettant entre guillemets "$var" et non pas $var
    Cordialement.

  3. #3
    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 disedorgue Voir le message
    Bonjour,

    2éme post ou l'on te signal que la syntaxe est [ -z ... ] et non pas [ ... -z ]

    protège tes variables en les mettant entre guillemets "$var" et non pas $var
    Oui. Et, pour débuter, il vaut mieux utiliser la commande "test", par exemple, if test -z "$var", ce qui te permettra de comprendre que tu peux écrire des choses comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if expr "$var" '*' 0 '+' 1 1>/dev/null 2>&1 
    then echo "$var est numérique"  
    else echo "$var n'est pas numérique"
    fi

  4. #4
    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,

    un shell compatible POSIX (c'est-à-dire pas C-shell) ne nécessite pas l'emploi de expr, qui est une commande externe; le shell peut faire des évaluations arithmétiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ var=zzz; test 3 -eq $(($var + 0)) && echo ok || echo ko
    ko
    $ var=3; test 3 -eq $(( $var + 0 )) && echo ok || echo ko
    ok
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    2éme post ou l'on te signal que la syntaxe est [ -z ... ] et non pas [ ... -z ]

    protège tes variables en les mettant entre guillemets "$var" et non pas $var
    oui, pardon
    j'ai due mal à comprendre la sémantique dans ce cas

    Oui. Et, pour débuter, il vaut mieux utiliser la commande "test"
    ok
    je pensais faciliter la lecture

    merci à vous deux, je vais essayer de retenir disedorgue, mais c'est la logique qui en découle que je retient pas
    car
    si on utilise un test comme $1 -ne 1 pour vérifier si une variable est différent de 1
    pourquoi doit ton faire -z $var si une variable est nul
    tous les test de chaine comporte le même ordre comparer au test de comparaison numérique qui sont inverser ?

  6. #6
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    protège tes variables en les mettant entre guillemets "$var" et non pas $var
    que veux tu dire par protège tes variables ?

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par jack-ft Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if expr "$var" '*' 0 '+' 1 1>/dev/null 2>&1
    Le '+' n'a pas besoin d'être protégé. Et si c'est juste pour protéger l'étoile, autant utiliser le backslash plus court à taper...if expr "$var" \* 0 + 1 1>/dev/null 2>&1

    Citation Envoyé par bosk1000 Voir le message
    je vais essayer de retenir disedorgue, mais c'est la logique qui en découle que je retient pas car si on utilise un test comme $1 -ne 1 pour vérifier si une variable est différent de 1
    pourquoi doit ton faire -z $var si une variable est nul
    tous les test de chaine comporte le même ordre comparer au test de comparaison numérique qui sont inverser ?
    La logique est la suivante
    • options à un seul opérande (-n, -z, -x, -f, -e, etc...): d'abord l'option, puis ensuite l'opérande
    • options à deux opérandes (-eq, -lt, -gt, -le, -ge, -ne, =, !=): opérande 1, option puis opérande 2 (comme dans une équation mathématique)

    J'avoue que l'option "polonaise inversée" aurait pu aussi être envisageable (test -lt 2 3) mais ce n'a pas été le choix des développeurs donc on fait avec. Et toujours en séparant distinctement tes éléments => test opérande1 <espace> option <espace> opérande2 <espace> -a/-o (and/or) <espace> opérande3 <espace> opérande4

    Citation Envoyé par bosk1000 Voir le message
    que veux tu dire par protège tes variables ?
    La commande test a parfois besoin de "voir" spécifiquement ce qu'on lui donne à tester. Si par exemple tu veux comparer ta variable avec "oui", tu seras tenté d'écrire naturellement test $var = "oui".
    Or, si ta variable "$var" est vide ; en écrivant test $var = "oui" le shell verra test = "oui" et ne comprendra pas cette syntaxe (il te répondra que l'opérateur "=" a besoin de deux opérandes).
    En rajoutant systématiquement des guillemets autour de ta variable (test "$var" = "oui"), tu la "protèges" des erreurs d'incompréhension du shell. Même si elle est vide, le shell verra test "" = "oui" et aura alors ses deux opérandes à comparer entre eux.
    Dans ton cas précis, avec l'option "-z" cela n'était pas grave (le shell accepte test -z sans rien derrière). Mais si tu prends l'habitude de mettre systématiquement des guillemets autout de tes variables quand tu les évalues, cela fonctionnera non seulement dans les cas où cela fonctionnait sans mais cela fonctionnera aussi dans les cas où cela posait problème => tu élimines tout risque d'erreur (regarde la ligne de jack-ft...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Il n'y a pas vraiment de méthode pour savoir si l'on doit écrire [ xxx -z ] ou [ -z xxx ], mais si l'on veut parler d’aberration, cela serait plutôt [ xx -eq yy ] car cette syntaxe est plus humaine qu'informatique. La forme la plus naturelle en informatique car plus simple à coder est l'écriture polonaise ce qui donnerait [ -eq xx yy ].
    Pour essayer de te souvenir de la syntaxe, dit toi que ce qui prime c'est l'action:
    Si l'action réclame un seul paramètre, alors celui-ci est situé après l'action.
    Si l'action réclame 2 paramètres, alors ils doivent encercler l'action.

    En ce qui concerne la protection des variables, si tu ne les mets pas entre guillemets et que les valeurs de celles-ci possèdent des espaces ou des retours à la ligne (entre autre), elles seront mal interprétées par les différentes commandes que tu utilisera avec. (vois les différents exemples de jack-ft dans tes autres post).
    Cordialement.

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

Discussions similaires

  1. [DATA] Test sur valeur numérique contenant des missing
    Par clao260 dans le forum SAS Base
    Réponses: 2
    Dernier message: 05/12/2013, 13h20
  2. [BO XIr2] Tests sur des différences entre dates
    Par Enthau dans le forum Deski
    Réponses: 4
    Dernier message: 27/07/2007, 10h49
  3. Problèmes Test sur des dates
    Par guigui11 dans le forum ASP
    Réponses: 1
    Dernier message: 11/12/2006, 16h18
  4. Test sur des records
    Par Tchaill39 dans le forum Delphi
    Réponses: 3
    Dernier message: 18/09/2006, 15h51
  5. [JUnit] Les tests sur des interfaces graphiques
    Par adilo dans le forum Tests et Performance
    Réponses: 5
    Dernier message: 01/02/2006, 14h27

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