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 :

tester si un argument est de type entier


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut tester si un argument est de type entier
    Bonjour
    j ai une fonction qui crashe si je lui passe un argument non entier. Je voudrais ajouter un test pour m'avertir aund le type du premier argument n'est pas entier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if $1 ......
    then
    exit
    ??

    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    Quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [[ $1 == +([0-9]) ]] 
    then 
       ... est entier... 
    fi
    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
    Expert confirmé 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 : 48
    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
    Par défaut
    utiliser les type sets permet d'éviter de tester les valeurs après leur entrées ce qui interdit donc toute erreur de détection potentielle.

    man bash
    man ksh

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    Citation Envoyé par frp31 Voir le message
    utiliser les type sets permet d'éviter de tester les valeurs après leur entrées ce qui interdit donc toute erreur de détection potentielle.
    Mais il ne faut pas oublier de trapper le message d'erreur...
    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.

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    j'ai essayé :

    typeset -i $1="99999999"

    ca ne marche pas.. erreur de syntaxe?

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    Citation Envoyé par freestyler Voir le message
    j'ai essayé :

    typeset -i $1="99999999"

    ca ne marche pas.. erreur de syntaxe?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     typeset -i mavariable=$1
    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.

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    oui oui je viens de le faire comme ceci
    il fallait donc declarer une variable puis l'utiliser en tant que telle dans ma fonction

    Le problème, c'est que si je lui rentre un non entier, il le convertit à zéro et continue le traitement, alors aue je veux au'il sorte (sans oublier aussi le fait que je peux avoir besoin du zéro)

  8. #8
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    je me suis peut être mal exprimé.

    Quand j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeset -i mavariable=$1
    tout se passe bien, sauf que si j'appelle ma fonction ainsi : (shell biensur)
    " mafonction eeee ", je n'ai pas de message d'erreur, mais plutot la fonction s'exécute normalement comme ci je l'ai appelé ainsi : " mafonction 0"

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    C'est au moment de l'affectation qu'une erreur est générée ou non
    Il faut donc tester le code retour de l'affectation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typeset -i mavariable
    mavariable=$1
    if [ $? -eq 0 ]
    then 
       echo $1 est un entier 
     else 
       echo $1 n'est pas un entier 
    fi
    Le test et l'affectation peuvent être regroupés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typeset -i mavariable
    if mavariable=$1 # ceci est une affectation, pas un test d'égalité !
     then ...
    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.

  10. #10
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Bah pour faire plus simple,
    il y'a l'option -n qui permet de tester si un arg est un entier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if [ -n  "$arg"  ] ; then
         echo "OK"
    else 
         echo "KO"
    fi

  11. #11
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    d'abord, le -n ne marche pas... il s'agit de tester si la longueur de la chaine donnée en argument est nulle ou pas, et je ne sais pas ou est ce que t'as trouvé ça, mais je suis preneur s'il s'avère vrai (en tout cas j'ai testé et ça ne marche pas)

    sinon, le problème avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if [ $? -eq 0 ]
    then 
       echo $1 est un entier 
     else 
       echo $1 n'est pas un entier 
    fi
    c'est que j'ai besoin du Zero.. c'est ce aue j'ai essayé d'expliquer la première fois, sinon, oui c'est trivial de faire un petit test comme celui là.


    Merci

  12. #12
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    $? contient la valeur de retour de la dernière commande exécutée, ici l'affectation, pas la valeur de la variable
    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
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par freestyler Voir le message
    d'abord, le -n ne marche pas... il s'agit de tester si la longueur de la chaine donnée en argument est nulle ou pas, et je ne sais pas ou est ce que t'as trouvé ça, mais je suis preneur s'il s'avère vrai (en tout cas j'ai testé et ça ne marche pas)

    sinon, le problème avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if [ $? -eq 0 ]
    then 
       echo $1 est un entier 
     else 
       echo $1 n'est pas un entier 
    fi
    c'est que j'ai besoin du Zero.. c'est ce aue j'ai essayé d'expliquer la première fois, sinon, oui c'est trivial de faire un petit test comme celui là.


    Merci
    Normalement ca devrait marcher. Fais un man test ou man bash, tu devrais trouver les explications sur cette option

    man test:
    -n string
    True if the length of string is non-zero.

  14. #14
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    Citation Envoyé par publicStaticVoidMain Voir le message
    Normalement ca devrait marcher. Fais un man test ou man bash, tu devrais trouver les explications sur cette option
    Relis le titre de la discussion...
    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.

  15. #15
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Relis le titre de la discussion...
    bah g compris, après il me dit ça :

    Citation Envoyé par freestyler Voir le message
    d'abord, le -n ne marche pas... il s'agit de tester si la longueur de la chaine donnée en argument est nulle ou pas, et je ne sais pas ou est ce que t'as trouvé ça, mais je suis preneur s'il s'avère vrai (en tout cas j'ai testé et ça ne marche pas)

    sinon, le problème avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if [ $? -eq 0 ]
    then 
       echo $1 est un entier 
     else 
       echo $1 n'est pas un entier 
    fi
    c'est que j'ai besoin du Zero.. c'est ce aue j'ai essayé d'expliquer la première fois, sinon, oui c'est trivial de faire un petit test comme celui là.


    Merci

  16. #16
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    Il répondait à ça :
    Citation Envoyé par publicStaticVoidMain Voir le message
    il y'a l'option -n qui permet de tester si un arg est un entier.
    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.

  17. #17
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    c'est pas au moment de l'affectation que l'erreur est générée..
    en fait, lors de l'affectation, le typeset va forcer une argument non entier à zéro... du coup y a pas d'erreur générée..

    je vois ou tu veux en venir, mais je ne crois pas que c'est ce qu'il me faut.. sous réserve que j'ai compris biensur...


    sinon, publicvoidmain... je ne comprends pas ce que tu dis.. je crois que tu t'es un peu égaré dans le sujet, non?
    et merci, je sais utiliser man

  18. #18
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    Citation Envoyé par freestyler Voir le message
    c'est pas au moment de l'affectation que l'erreur est générée..
    en fait, lors de l'affectation, le typeset va forcer une argument non entier à zéro... du coup y a pas d'erreur générée..
    En effet, j'avais testé avec ksh qui est plus restrictif que bash
    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.

  19. #19
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    En effet, je me suis trompé et je m'en excuse.
    Je croyais que l'option -n permettait de tester si un arg était un entier. Quand j'ai lu le man de bash ou man test, apparemment il y'a pas d'options qui permet de le tester. En fait , j'ai trouvé un autre moyen pour tester si un argument est un entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if  `echo "$arg" | grep "[+|-][123456789]"` ; then
     echo "OK"
    else 
     echo "KO"
    fi
    Je teste la valeur de retour du grep. Si ca vaut zero, on affiche "OK" ou sinon on affiche "KO"

    J'espere que ca peut t'aider.

Discussions similaires

  1. tester si la saisie est de type String
    Par abj8077 dans le forum Débuter avec Java
    Réponses: 17
    Dernier message: 07/05/2011, 10h37
  2. Comment tester si une valeur de type entier est nulle ?
    Par kikidrome dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 08/07/2009, 00h53
  3. tester si un fichier est de type excel
    Par mitje dans le forum Langage
    Réponses: 4
    Dernier message: 20/09/2006, 02h45
  4. comment tester si une variable est de type indifined
    Par amelhog dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 10/08/2005, 09h32
  5. [XSL] Tester si la valeur est un entier dans un xml
    Par MrMaze dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/07/2003, 04h35

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