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 :

Eviter ou tester le caractère * (étoile) dans les arguments de la commande READ


Sujet :

Linux

  1. #1
    Membre confirmé
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Par défaut Eviter ou tester le caractère * (étoile) dans les arguments de la commande READ
    Bonjour,

    j'ai un petit souci concernant un script dans le quel je demande la date en saisie avec la commande READ et ensuite je fait un test pour savoir si l'argument n'est pas vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read date
       do
         if  [ -z ${date} ]
          echo "date vide"
    Résultat :
    Entrez une date ?
    + echo 'Exemple 23 fevrier 2010 => 23022010'
    Exemple 23 fevrier 2010 => 23022010
    + read date
    *
    + '[' -z anaconda-ks.cfg bonjour.sh cal.txt chomp.pl cmd.txt '#commentaire' essai essais facto facto2 facto3 factorielle 'Fichier dont le nom contient des espaces' fs_ext3.img histo.txt inc install.log install.log.syslog new new2 new3 new4 newx nom.pl nouveau parag param rman_1 sys01 tab.pl test test2 toto tutu week.log why ']'
    newx: line 37: [: trop d'arguments


    la date est sous ce format jjmmaaaa. En faite je m'aperçois que si je met le caratère étoile en argument ça plombe le progamme, et je voulais savoir comment faire un test sur cette saisie particulière afin de l'exclure des possibilité ?

    merci.

  2. #2
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Et ça, ça marche ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read date
    do
    if [ -z "$date" ]
    echo "date vide"
    fi

  3. #3
    Membre confirmé
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Par défaut
    Bonjour,

    non désolé ça ne marche pas, car le test vérifie juste si la chaine de caractère est vide ou non. Lorsque l'on rentre * ou ***** ou 54*4*8, le shell considère ces entrées comme le caractère joker, d'ou le fait je pense qu'il répond "trop d'argument"

    Le but c'est d'essayer de faire en sorte que si l'utilisateur rentre dans la saisie des caractère tel que * ou ***** ou |{[|{[|{ cela puisse être analysé et renvoyé une erreur.

    Ce serait dans ce style :

    date ?
    saisie $date
    si $date est égal soit a * ou **** ou 12**59/* ou [{|[
    renvoie une erreur et recommence.

  4. #4
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Ce que je voulais montrer, c'est que de mettre la variable entre " " évite l'expansion de paramètres et permet l'interprétation quasi littérale.

    L'optimum serait de vérifier la validité de la date. Avec GNU date:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    read -p "Entrez la date : " $DTE
    if date -d "$DTE"
    then echo "Date OK"
    else echo "Ce n'est pas une date valable"
    fi

  5. #5
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Par défaut
    Bjr,
    Citation Envoyé par sedawk Voir le message
    Ce serait dans ce style :

    date ?
    saisie $date
    si $date est égal soit a * ou **** ou 12**59/* ou [{|[
    renvoie une erreur et recommence.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #! /bin/bash
    while true
    do
    echo 'entrez date :'
    read madate
    [[ "${madate}" =~ \*|\[|\{|\]|\} ]] && echo 'erreur' || break
    done
    exit
    Ca devrait répondre à la demande ?

  6. #6
    Membre confirmé
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Par défaut
    Salut merci pour ta réponse, mais le shell n'aime pas trop les caractères entrés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [root@localhost ~]# cat > ess
    #! /bin/bash
    while true
    do
    echo 'entrez date :'
    read madate
    [[ "${madate}" =~ \*|\[|\{|\]|\} ]] && echo 'erreur' || break
    done
    exit
    [root@localhost ~]# chmod 777 ess
    [root@localhost ~]# ./ess
    ./ess: line 6: syntax error in conditional expression: unexpected token `|'
    ./ess: line 6: syntax error near `|\'
    ./ess: line 6: `[[ "${madate}" =~ \*|\[|\{|\]|\} ]] && echo 'erreur' || break'
    D'où vient le problème ? pour être encore plus précis, il faudrait qu'aucun caratère ou enchainement de caractères spéciaux soit pris en compte dans la saisie.

  7. #7
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Par défaut
    Chez moi, ce script fonctionne !

    Il était tard, j'avais bien lu ta demande...
    Si tu veux boucler si autre chose que aaaammjj, donc uniquement des caractères numériques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #! /bin/bash
    while true
    do
    echo 'entrez date : '
    read madate
    [[ "$madate" =~ [^[:digit:]] ]] && echo erreur || break
    done
    exit
    Mais ce que propose @fransoo a l'air de répondre à tes attentes ?

  8. #8
    Membre confirmé
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Par défaut
    Salut,

    ton dernier code fonctionne chez moi, merci. En faite finalement j'ai fini par trouver, cela donne ça :

    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
    while read date
      do
       if  test  -z  "$date"
        then
         echo "La date est vide ?"
          choix
        else
      echo "$date" | egrep '^[ 0-9]{8}$' 1> /dev/null
     
       if [ $? -ne 0 ]
        then
         echo "la date ne doit contenir que des chiffres et est compose de 8 caracteres  !!!"
         choix
       else
    etc..
    Le problème était que le test d'existence de chaine de caractères renvoyait "trop d'arguments" à chaque fois qu'une "*" était saisie et passé en paramètre. Il semblerait qu'en utilisant le test sous la forme if [ -z "$xxx" ] , la valeur de la variable était interprété, alors qu'en faisant if test -z "$xxx", la variable n'était plus interprété...

    Quelqu'un sait pourquoi ?

    @fransoo : merci pour ton aide, la suggestion du date est en effet une solution, masi je crains que le date de gnu ne passe pas sur des anciennes machine UNIX non a jour...

    @AnsuzPeorth : As tu une idée de pourquoi ton premier script ne fonctionne pas chez moi ? cela m'intéresserait, en tout cas merci pourton aide car j'ai pu apprendre de nouvelle chose

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    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 816
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sedawk Voir le message
    Il semblerait qu'en utilisant le test sous la forme if [ -z "$xxx" ] , la valeur de la variable était interprété, alors qu'en faisant if test -z "$xxx", la variable n'était plus interprété...
    Etonnant !!! [ xxx ] est pourtant équivalent à test xxx !!!???!!!

    Je regarderai ça aujourd'hui...

    [edit] Sur un bash Linux, il y a bien équivalence - Voici un extrait de mon test

    [login ~]$ set -x
    [login ~]$ read var
    + read var
    *
    [login ~]$ test -z "$var"
    + test -z '*'
    [login ~]$ [ -z "$var" ]
    + '[' -z '*' ']'
    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]

  10. #10
    Membre confirmé
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Par défaut
    Oui ça marche aussi de mon côté, va savoir ou j'ai eu ce problème

    autant pour moi

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

Discussions similaires

  1. [Batch] caractère espace dans les paramètres d'une commande
    Par coleed dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 02/08/2011, 16h11
  2. Caractères spéciaux dans les noms de variables POST
    Par guidav dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2007, 13h36
  3. Caractère étoile dans une requête
    Par deviltaz dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/01/2007, 11h10
  4. Caractères transformés dans les chemins de fichier
    Par canabral dans le forum Langage
    Réponses: 4
    Dernier message: 15/12/2005, 15h24

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