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

Linux Discussion :

Trouver le type d'une variable


Sujet :

Linux

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut Trouver le type d'une variable
    salut,

    J'aurai aimé savoir en unix comment trouver le type d'une variable :
    j'ai un script dans lequel je saisi une variable avec un read et si cette variable est une lettre ,j'affiche que c'est une lettre et si c'est un chiffre j'affche que c'est un chiffre;

    existerai t il une commande unix qui permette de determiné le type d'une variable ?

    Merci.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    non le type des variables en shell est toujours "chaine"

    par contre a l'aide d'expression reguliere il devient possible de determiner s'il sagit de lettre ou chiffre.

    ^[a-zA-Z][a-zA-Z]*$ ligne ne contenant que des lettres
    ^[0-9][0-9]*$ ligne ne contenant que des chiffres

    donc un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    read ma_variable
    if $(echo $ma_variable | grep '^[0-9][0-9]*$')
    then
      echo $ma_variable et un chiffre
    fi
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  3. #3
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    j'ai fait cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo " entrer une chaine"
    read chaine
    if $(echo $chaine | grep '^[0-9][0-9]*$')
    then
      echo "$chaine est un chiffre"
    fi
    mais quand je fait cela et que je lance mon script j'ai ce message,apres avoir saisi la chiffre


    command not found

    ???

  4. #4
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Plutôt ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo " entrer une chaine"
    read chaine
    if echo $chaine | grep -q '^[0-9][0-9]*$'
    then
      echo "$chaine est un chiffre"
    fi
    Pas besoin d'utiliser $( ) pour récupérer l'affichage de la commande.
    Ajouter un -q pour rendre le grep silencieux.

    Sinon, MarcG, pourquoi doubler le motif de recherche ? '^[0-9]*$', par exemple, devrait être suffisant ... ou une subtilité m'échappe
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  5. #5
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    merci de ton aide
    donc si j'ai bien compris ce qui n'allai pas c 'est le dollard avant la parenthese
    donc j'ai essayer sa fonctionne;
    à quoi sert l'option -q du grep ?
    j'ai essayer de tester donc s'il s agit d'une lettre et sa ne fonctionne pas pourtant j'ai suivi le meme raisonnement;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    echo " entrer une chaine"
    read chaine
    if echo $chaine | grep -q '^[0-9][0-9]*$'
    then
      echo "$chaine est un chiffre"
    elseif echo $chaine | grep -q '^[a-zA-Z][a-zA-Z]*$'
    then
    echo "$chaine est une chaine"
    fi
    j'ai cette erreur
    syntax error near unexpected token 'then'
    'then'

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    doubler le motif signifie au moins 1 fois le motif, si tu ne le double pas cela signifie 0 ou n fois le motif

    pour l'erreur c'est le elseif que le shell n'aime pas .
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  7. #7
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    en faite vu qu'il ne l'aime pas je l 'ai changer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    echo " entrer une chaine"
    read chaine
    if echo $chaine | grep -q '^[0-9][0-9]*$'
    then
      echo "$chaine est un chiffre"
    $chaine>>f1.txt
    fi
    if echo $chaine | grep -q '^[a-zA-Z][a-zA-Z]*$'
    then
    echo "$chaine est une chaine"
    $chaine>>f2.txt
    fi
    le truc qui ne fonctionne,est que sa ne redirige pas le resultat de $chaine dans le fichier f1 ou f2 ,pourquoi ??

  8. #8
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    j'ai trouver il faut rajouter un echo devant les $chaine

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    tu pourrais aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    read ma_var
    case $ma_variable
        '^[0-9][0-9]*$')
             echo $ma_var est un numerique >> f1.txt
             ;;
        '^[a-zA-Z][a-zA-Z]*$')
             echo ma_var est une chaine >> f2.txt
            ;;
        *)
             echo $ma_var n est ni une chaine ni numerique >> f3.txt
    esac
    il y a souvent plusieurs façon d arriver au meme resultat, de même que les bonnes façons sont avant tous celles qui fonctionnent
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  10. #10
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    et le grep -q en faite il sert à quoi ?
    j'ai pas trop saisi;
    j'ai un man grep mais je pije toujours pas trop

  11. #11
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $ read x; ( typeset -i x 2>/dev/null ) && echo chiffre || echo lettre
    12
    chiffre
    $ read x; ( typeset -i x 2>/dev/null ) && echo chiffre || echo lettre
    xxx
    lettre

  13. #13
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    au lieu de cela
    j'aurai pu faire cela

  14. #14
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Melvine
    au lieu de cela
    j'aurai pu faire cela
    Ca ne veut pas du tout dire la même chose !!!

    La première proposition correspond à :
    • le debut de la chaine ^
    • un chiffre [0-9]
    • un nombre de chiffres supplémentaires quelconque [0-9]*
    • la fin de la chaine $

    S'il y a quoi que ce soit de plus, c'est rejeté.

    La seconde proposition correspond à :
    • quelquechose (quoi ?) répété un nombre nul ou quelconque de fois *
    • un chiffre [0-9]
    • un nombre de chiffres supplémentaires quelconque [0-9]*

    Au défaut de la première étoile qui sert à répéter on ne sait quoi, cette expression peut correspondre à "Catch22" par exemple, qui n'est pourtant pas un chiffre.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  15. #15
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par 2Eurocents
    • le debut de la chaine ^
    Pas dans un case, case accepte seulement les Développement des noms de fichiers (man bash)

    Donc le motif sera *([0-9])

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $ case abc in *([0-9])) echo yes;; esac
    $ case 1abc in *([0-9])) echo yes;; esac
    $ case abc2 in *([0-9])) echo yes;; esac
    $ case 123 in *([0-9])) echo yes;; esac 
    yes

    ou +([0-9]) pour ne pas prendre chaine vide

  16. #16
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    je l'ai changer comme ceci car sa ne fonctionnait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    read ma_var
    case $ma_variable
        *[0-9]*)
             echo $ma_var est un numerique >> f1.txt
             ;;
        *[a-z]*)
             echo ma_var est une chaine >> f2.txt
            ;;
        *)
             echo $ma_var n est ni une chaine ni numerique >> f3.txt
    esac
    j'ai voulu integrer une condition avec un while pour sortir quand je le souhaite mais sa ne fonctionne,est ce que c'est du au faite que j'utilise un emulateur ?
    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
     
    read ma_var
    while ["$ma_variable"!="sortie"]
    do
    read ma_var
    case "$ma_variable" in
        *[0-9]*)
             echo $ma_var est un numerique >> f1.txt
             ;;
        *[a-z]*)
             echo ma_var est une chaine >> f2.txt
            ;;
        *)
             echo $ma_var n est ni une chaine ni numerique >> f3.txt
    esac
    done

  17. #17
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    ton case est bidon

    quand à ton while, il y manque des espaces

Discussions similaires

  1. Tester le type d'une variable et trouver un ppcm
    Par sic_88 dans le forum Débuter
    Réponses: 2
    Dernier message: 03/11/2009, 21h36
  2. Réponses: 15
    Dernier message: 30/11/2007, 15h36
  3. Connaitre le type d'une variable
    Par mic79 dans le forum Langage
    Réponses: 2
    Dernier message: 04/01/2006, 15h42
  4. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48
  5. Changer el type d'une variable sql sous postgre8/admin
    Par smag dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 24/08/2005, 12h31

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