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 qui détermine si un argument est numérique


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut Script qui détermine si un argument est numérique
    hey hey, c'est encore sk8trasher avec c'est petit programme en bourne shell
    Une des question de mon devoir, demande d'écrire un programme, qui détermine si un argument est numérique ou pas. L’énoncé demande d'utiliser la valeur de sortie de la fonction expr.

    Alors j'ai plusieurs versions, une que j'ai écrit par mes recherches, et l'autre l'aide envoyé par l'école, le script de l'école affiche des erreur quand on le lance. Où est l'erreur.
    Code Mon script : 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
     
    #!/bin/sh  
    # script_expr.sh 
    case $# in
    	0)	echo "Fournissez moi un argument s'il vous plait:"
    		read arg;;
     
    	*)	arg=$1;;
    esac
    arg=$1 
    expr $arg + 0 1>/dev/null 2>&1 
    statut=$?  
    if test $statut -lt 2  
    then  
     echo "$arg" est un argument numérique
    else
     echo "$arg" n\'est pas un argument numérique
     
    fi

    Code Script d'aide: où est l'erreur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/bin/sh
    case $# in
    	0)	echo "Fournissez moi un argument s'il vous plait:"
    		read arg;;
     
    	*)	arg=$1;;
    esac
    personne='expr $arg + 1 2>/dev/null'
    if test $? –eq 0
    	then echo $arg est numerique
    	else echo $arg n\'est pas numerique
    fi

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

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

    les apostrophes ' ne permettent pas d'interpréter les commandes.
    au pire, il faut utiliser des accents graves ` (AltGr - 7), au mieux la substitution de commandes moderne $( ).

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 728
    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 728
    Points : 31 050
    Points
    31 050
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sk8trasher Voir le message
    Code Script d'aide: où est l'erreur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/bin/sh
    case $# in
    	0)	echo "Fournissez moi un argument s'il vous plait:"
    		read arg;;
     
    	*)	arg=$1;;
    esac
    personne='expr $arg + 1 2>/dev/null'
    if test $? –eq 0
    	then echo $arg est numerique
    	else echo $arg n\'est pas numerique
    fi
    Salut
    Indépendamment de l'erreur de syntaxe mentionnée par N_Bah, ce script ne fonctionne pas si arg vaut -1. En effet, dans ce cas expr affiche 0 et quand expr affiche 0, il renvoie 1. Donc ce script affichera que -1 n'est pas numérique alors qu'il l'est.

    De plus, la variable "personne" n'étant pas utilisée, pourquoi la créer ???

    Donc si c'est vraiment ton école qui t'a fourni ce script je reste dubitatif quand à son niveau en shell. Ton script (qui ressemble étrangement à celui qui se trouve dans mon cours shell ) est quand-même bien meilleur...

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    Merci pour ces réponses. Je suis rassuré vis à vis de ma programmation par contre je suis septique par rapport à l'école, ça craint...

    pour bien finir cet exo, j'aurai voulu commenter ces deux lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    expr $arg + 0 1>/dev/null 2>&1 
    statut=$?
    C'est dingue j'ai réussi à programmer quelque chose que je ne saurai expliquer aujourd'hui.
    $arg +0 1>/dev/null 2>$1 (je sais pas comment elle est sortie cette ligne là).
    $? ça veut dire quoi ?
    Merci de vos réponses

  5. #5
    Membre habitué Avatar de eric-m
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 145
    Points
    145
    Par défaut
    C'est de la redirection de flux.
    Içi on redirige la sortie d'erreur standard (stderr : 2) vers la sortie standard nommée (stdout : 1), puis l'affichage de la sortie standard est redirigé vers /dev/null.

    $? contient le code de retour de la commande expr.

    En tout cas toutes mes félicitiations pour réussir à écrire un code sans le comprendre, c'est sans doute ce qu'on appelle de la programmation divinatoire

  6. #6
    Membre habitué Avatar de Levi59
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 58
    Points : 148
    Points
    148
    Par défaut
    Citation Envoyé par eric-m Voir le message
    En tout cas toutes mes félicitiations pour réussir à écrire un code sans le comprendre, c'est sans doute ce qu'on appelle de la programmation divinatoire
    Ou du suicide informatique, tout dépend du contenu du programme

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par Levi59 Voir le message
    Ou du suicide informatique, tout dépend du contenu du programme
    J'aime bien que l'on appelle ça de la programmation divinatoire. En vrai, il y a beaucoup de sources sur le net, et les exercices que je dois rendre ont déjà été évoqués sur d'autres forums. Du coup c'est pas si divinatoire que ça. Dommage.

    La programmation c'est complexe. Il y a beaucoup de notions, vocabulaires, structures à acquérir. Le terminal est intransigeant sur la syntaxe d'une commande (et heureusement d'un certain côté).

    Du coup je percute pas, où et comment le script détermine si l'argument est numérique ou pas.
    c'est ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    statut=$?  
    if test $statut -lt 2
    parce que le code retour de "expr $arg + 0" ça donne quoi ?

  8. #8
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Rien ne vaut de faire des tests soi-même pour essayer de comprendre les tenants et aboutissants :

    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
    45
    46
    47
    # On initialise une variable numérique
    $ arg=1
     
    # On exécute la commande, ici une somme
    $ expr ${arg} + 0
    1
     
    # On affiche le code retour (comme la commande c'est bien passée le code est true = 0)
    $ echo $?
    0
     
    # On initialise une variable non numérique
    $ arg=A
     
    # On exécute la commande (qui affiche de ce fait un message d'erreur) 
    $ expr ${arg} + 0
    expr: non-integer argument
     
    # On affiche le code retour (comme la commande c'est mal passée le code est faux, différent de zéro)
    $ echo $?
    2
     
    # Maintenant la même chose en redirigeant uniquement la sortie standard (1) vers le néant (>/dev/null)
    $ arg=1
     
    # Comme la commande aboutie, il n'y a aucun affichage
    $ expr ${arg} + 0 1>/dev/null
     
    $ echo $?
    0
     
    # Maintenant on passe à la variable non numérique
    $ arg=A
     
    # Comme la commande n'aboutie pas, un message d'erreur est affichée
    $ expr ${arg} + 0 1>/dev/null
    expr: non-integer argument
     
    $ echo $?
    2
     
    # Maintenant on dirige la sortie d'erreur (2) vers la sortie standard (1)
    # Aucun message n'est affiché
    $ expr ${arg} + 0 1>/dev/null 2>&1
     
    $ echo $?
    2

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 728
    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 728
    Points : 31 050
    Points
    31 050
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sk8trasher Voir le message
    J'aime bien que l'on appelle ça de la programmation divinatoire. En vrai, il y a beaucoup de sources sur le net, et les exercices que je dois rendre ont déjà été évoqués sur d'autres forums. Du coup c'est pas si divinatoire que ça. Dommage.

    La programmation c'est complexe. Il y a beaucoup de notions, vocabulaires, structures à acquérir. Le terminal est intransigeant sur la syntaxe d'une commande (et heureusement d'un certain côté).

    Du coup je percute pas, où et comment le script détermine si l'argument est numérique ou pas.
    c'est ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    statut=$?  
    if test $statut -lt 2
    parce que le code retour de "expr $arg + 0" ça donne quoi ?
    Le principe de ce code est le suivant: tu effectues un calcul mathématique quelconque sur l'argument. Si le calcul réussi, alors c'est que l'argument est numérique. S'il ne réussi pas, c'est qu'il ne l'est pas.
    Donc tu utilises expr (dont un des buts est d'évaluer une expression mathématique) pour calculer $arg + 0 (ce qui est bien un calcul).
    Si expr arrive à effectuer le calcul, alors son statut (que tu récupères dans $?) vaut 0 si le résultat du calcul n'est pas 0 et vaut 1 si le résultat du calcul vaut 0.
    Si expr n'arrive pas à effectuer le calcul, alors son état vaut autre chose (généralement 2).
    Donc te suffit de regarder si $? vaut 0 ou 1 ou autre chose. Et pour ne pas être gêné par les affichages de expr (car expr affiche son résultat ou ses problèmes), tu rediriges ces affichages vers le fichier /dev/null (qui est la poubelle des affichages).

    A noter toutefois que expr ne travaillant qu'avec des nombres entiers, si tu testes ce code sur 12.25 il te répondra qu'il n'est pas numérique. Pour ça, il y a une autre possibilité: tu transformes via de multiples sed chaque chiffre et un seul point éventuel en "rien" (ne pas oublier aussi un "moins" éventuel placé en début de mot). Si au final il te reste quelque chose, c'est que l'argument n'était pas numérique...

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    Merci pour ces explications très claire pour un novice.
    Mais j'ai encore une souci, parce-que le programme marche qu'à moitier. voyer les réponse que le terminal me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    user@K73E:~/Dropbox/EDUCATEL/PRATIQUE_UNIX/dev4/final$ sh numerique dd
    dd n'est pas un argument numérique
    user@K73E:~/Dropbox/EDUCATEL/PRATIQUE_UNIX/dev4/final$ sh numerique 
    Fournissez moi un argument s'il vous plait:
    dd
     est un argument numérique
    Ca marche lorsque l'on donne l'argument directement dans la ligne de lancement, par contre si l'on passe par l'étape où le terminal demande de saisir un argument. L'argument est toujours numérique. Rrrrhh, je reste zen
    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
    #!/bin/sh  
     
    case $# in
    	0)	echo "Fournissez moi un argument s'il vous plait:"	#si l\'utilisateur n\'a pas sasi d\'argument, le shell le demande
    		read arg;;						#saisi de l\'argument
     
    	*)	arg=$1;;						#affection de la valeur saisi dans la commande de lancement à la variable arg
    esac
    arg=$1 
    expr $arg + 0 1>/dev/null 2>&1 						#La fonction expr fait la somme de la variable avec 0. 
    									#Si la commande n'aboutie pas, la sortie standard (1) est redirigé vers le néant (>/dev/null). 
    									#Si la commande aboutie, nous passons à la ligne suivante.
    statut=$?  								#Le code de sortie du flux expr est comparé. Le statut (que l'on récupères dans $?) vaut 0 si le 		
    									#résultat du calcul n'est pas 0 et vaut 1 si le résultat du calcul vaut 0.
    									#Si expr n'arrive pas à effectuer le calcul, alors son état vaut autre chose (généralement 2).
    if test $statut -lt 2  							#Le code de sortie du flux expr est comparé
    then  
     echo "$arg" est un argument numérique					#Si la valeur de statut est inférieur à deux, cela veut dire que le calcul s'est bien effectué: 
    									#l'argument est donc bien numérique
    else
     echo "$arg" n\'est pas un argument numérique				#Sinon l'argument n'est pas numérique
     
    fi

  11. #11
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    C'est ta ligne n°9 qui fiche le bazar

    En effet tu définis ta variable "$arg" en la demandant, puis à la sortie du "case" tu la définis à la valeur de "$1" qui pour le coup n'existe pas vu qu'on est dans le cas où l'argument n'a pas été donné en paramètre.

    Donc vire cette ligne

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    oh yes, biensûr, comrpis.
    ça marche nickel

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

Discussions similaires

  1. [Script Bash] Tester si $1 est numérique
    Par COGAN dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 06/11/2018, 10h41
  2. [UNIX CMD] Command qui détermine si un processus est "sleeping"
    Par Rithy666 dans le forum Shell et commandes POSIX
    Réponses: 2
    Dernier message: 05/08/2010, 15h56
  3. Qui pourrait nous dire quel est le script utilisé ?
    Par ..::snake::.. dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 19/09/2007, 14h25
  4. fonction qui vérifie si une valeur est numérique?
    Par ryadh.naouar dans le forum C
    Réponses: 16
    Dernier message: 05/07/2007, 17h33
  5. [Script] Qui est administrateur ...
    Par ¤FRIX¤ dans le forum Sécurité
    Réponses: 6
    Dernier message: 06/04/2004, 11h58

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