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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ?

+ 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