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 :

Validation d'une valeur saisie.


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 29
    Points : 29
    Points
    29
    Par défaut Validation d'une valeur saisie.
    Bonjour tout le monde.

    J'ai un petit soucis dans un script, dans lequel je fais saisir une valeur.

    En gros, je recherche un fichier suivant un schéma et si j'en ai plusieurs, j'affiche la liste des fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    0) fichier0
    1) fichier1
    2) fichier2
    faites votre choix[defaut:2]
    Le problème viens que si on fait Entrée directement sans saisir de valeur, j'obtiens un null!.

    En gros, voila mon code (plus simple )

    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
          echo "# Attention, il y a plus d'un fichier M696M00.xxxxxxxx.ibm" >> $Rep_Log$Fic_Log
          echo "Plusieurs fichiers M696M00.xxxxxxxx.ibm sont disponibles"
          j=0
          for i in $(ls -tr $Rep_Trv | grep "M696M00.[A-L][0-9]\{7\}.ibm")
          do
            echo "$(ls -l | awk '{print $9", date du "$7" "$6", a "$8}'| grep $i) > $(cat $Rep_Trvx$i)" >> $Rep_Log$Fic_Log
            # Affichage de la liste des fichiers, avec leur date de modification et le contenu
            Tab_Fic[$j]=$i
            echo "$j) $(ls -l | awk '{print $9", date du "$7" "$6", a "$8}'| grep $i) > $(cat $Rep_Trvx$i)"
            j=$(($j+1))
          done
          j=$(($j-1))
          echo "Merci de rentrer votre choix [defaut:$j]"
          choix=$j
          read choix
          if [ $choix -ge 0 ] && [ $choix -le $j ]
          then
            echo "valide"
            j=$choix
          fi
    Si je rentre pas de valeur j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Plusieurs fichiers M696M00.xxxxxxxx.ibm sont disponibles
    0) M696M00.B0000000.ibm, date du 19 Feb, a 15:26 > 21
    1) M696M00.B0000001.ibm, date du 25 Feb, a 12:34 > 23
    Merci de rentrer votre choix [defaut:1]
     
    ./Manuel.sh[36]: test: argument expected
    Fic_NbT=M696M00.B0000001.ibm
    J'ai bien le fichier pris par défaut mais j'ai une erreur.

    Si vous avez des idées

  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
    normal :
    read réinitialise de toute façon la variable donc si rien n'est saisie, ta variable choix et mise à rien ...... et ton test plante !
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 29
    Points : 29
    Points
    29
    Par défaut
    Ca je sais bien, et si je rajoute un test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [ ! $choix ]
    then
      Justement, que faire??
    fi
    Et un case ne fonctionne pas.

    Alors comment faire pour gérer l'erreur et qu'elle ne s'affiche pas, puisque j'ai la bonne valeur de toute facon??

    Merci à vous.

  4. #4
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Un tuyau, insére la commande set -x pour voir comment le shell interprète tes instructions :

    Pas bon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    + echo 'Merci de rentrer votre choix [defaut:2]'
    Merci de rentrer votre choix [defaut:2]
    + choix=2
    + read choix
    
    + '[' -ge 0 ']'
    ./xscript02.sh: line 8: [: -ge: unary operator expected

    Presque bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    read choix
    if [[ ! -n $choix ]] ; then
    	echo "Vide !!!"
    	choix=$j
    elif [[ $choix -ge 0  &&  $choix -le $j ]] ; then
    	echo "valide"
    	j=$choix
    fi


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    + echo 'Merci de rentrer votre choix [defaut:2]'
    Merci de rentrer votre choix [defaut:2]
    + choix=2
    + read choix
     
    + [[ ! -n '' ]]
    + echo 'Vide !!!'
    Vide !!!
    + choix=2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Merci de rentrer votre choix [defaut:2]
    + choix=2
    + read choix
    1
    + [[ ! -n 1 ]]
    + [[ 1 -ge 0 ]]
    + [[ 1 -le 2 ]]
    + echo valide
    valide
    + j=1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    + echo 'Merci de rentrer votre choix [defaut:2]'
    Merci de rentrer votre choix [defaut:2]
    + choix=2
    + read choix
    xyz
    + [[ ! -n xyz ]]
    + [[ xyz -ge 0 ]]
    + [[ xyz -le 2 ]]
    + echo valide
    valide
    + j=xyz
    
    Loi de Murphy:
    La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
    La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
    Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par iuchiban Voir le message
    Si vous avez des idées
    C'est un problème classique dans la gestion d'une saisie et dans ce que "comprend" le shell
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "On continue ?"
    read rep
    test $rep = oui && echo "ok" || echo "bye"
    Le problème arrive quand tu ne saisis rien => ta variable "rep" est vide et le shell voit
    test = oui
    ce qui est totalement bancal vu que l'opérateur "=" exige deux opérandes (et là il n'en voit qu'un seul)

    Pour résoudre le problème, il suffit de mettre des guillemets chaque fois que tu veux traiter la variable saisie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "On continue ?"
    read rep
    test "$rep" = "oui" && echo "ok" || echo "bye"
    Là, même si la variable est vide, le shell verra
    test "" = "oui"
    et saura gérer vu que la syntaxe est respectée

    Au delà de cette astuce qui te supprimera un tas de problèmes dans la gestion des valeurs saisies, tu peux utiliser l'opérateur ${var:-valeur} qui te renvoie "valeur" si "var" est vide ou inexistante
    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]

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/06/2014, 15h18
  2. [Débutant] Validation d'une valeur numérique dans une variable String
    Par anto84 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 11/07/2007, 10h26
  3. Reprendre une valeur saisie dasn plusieurs feuilles
    Par CélineM dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/06/2007, 17h19
  4. tester le type d'une valeur saisie
    Par lalaurie40 dans le forum C
    Réponses: 1
    Dernier message: 09/10/2005, 21h52
  5. Réponses: 2
    Dernier message: 11/12/2004, 21h20

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