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 :

Controle de saisie avec shell


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 47
    Points : 44
    Points
    44
    Par défaut Controle de saisie avec shell
    Salut je débute la programmation shell et j'ai trouvé une difficulté pour réaliser un script qui lit les nom, prénom, sexe .. tous ça avec (read) et j'ai fait la redirection vers une fiochier (aux) mais je veux optimiser le script en faisant un controle de saisie sur les entrées et voilà mon script
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #!/bin/bash
     
    echo NOM : 
    read nom
     
    echo PRENOM : 
    read prenom
     
    echo SEXE_
    echo 1-Masculin
    echo 2-Féminin
    read sexe 
    echo DATE DE NAISSANCE (jj/mm/aaaa) : 
    read date
     
    echo CIN : 
    read cin 
     
    echo NOMBRE D'ENFANTS : 
    read nbenf
     
    cpt = 0
    while ($cpt -lt $nbenf)
    do 
    echo ID $cpt : 
    read id 
    echo "$id ">> idenf.temp 
     
    cpt = `expr cpt + 1`
    done

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    Salut
    Permet moi (tres debutant en Bash) d'apporter un peu ma contribution.
    Alors dis moi si je me trompe mais tu voudrais vérifier les saisies faites pour tes variables définies par read , c'est ça ? afin de vérifié si le choix peut etre admis ou non.
    dans cas je verrais bien une fonction qui serait appelé dans la boucle ( je ne te garanti pas que c'est le meilleur moyen de programmer en bash, attend plutot l'avis d'expert).
    le tout est de savoir quels sont tes criteres de choix.
    par exemple il ne peut y avoir de chiffre dans un prenom ou nom
    de meme il ne peut y avoir de chaine de caractères dans le read de nombre enfants etc...
    dans ma premiere idée je vois quelque chose comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    shopt -s extglob
    valeurchaine=geoffrey
    valeurnum=abcde
    if [[ "$valeurchaine" != +([a-z]|[A-Z]) ]]; then 
    	echo -e "arguments incorrect \n Veuillez reintroduire la valeur:\c"; read valeurchaine
     
    elif [[ "valeurnum" != +([0-9]) ]]; then 
    	echo -e "arguments incorrect \n Veuillez reintroduire la valeur:\c"; read valeurnum
     
    fi
    ceci est une idée et rien d'opérationnel
    faudrait peut etre voir du coté des Ere [[ :digit ]] [[ :alpha ]] doit y avoir moyen de faire plus propre

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Exemple simple de saisie contrôlée

    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
    #!/bin/sh
    while true
    do
        echo "Réponse O/N ?"
        read rep
        case $rep in
             [oO][uU][iI] | [oO])
                    rep=o
                    break
                    ;;
             [nN][oO][nN] | [nN])
                    rep=n
                    break
                    ;;
             *) echo "Mauvaire réponse - Recommencez"
        esac
    done
     
    echo "Réponse: $rep"
    Le principe est de programmer une saisie infinie et de sortir quand tout correspond ce qui évite la répétition de saisie

    Autre exemple: vérifier si la réponse est un nombre entier => principe: faire un calcul avec expr (calcul entier uniquement) sur la valeur saisie et regarder si le calcul réussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/sh
    while true
    do
        echo "Votre chiffre ?"
        read nb
        expr $nb + 0 1>/dev/null 2>/dev/null; status=$?
     
        test $status -lt 2 && break
     
        echo "$n n'est pas un nombre - Recommencez"
    done
     
    echo "Réponse: $nb"
    Autre exemple: vérifier si la réponse est un nombre tout court, négatif ou non, avec point décimal ou non => principe: remplacer tout ce qui correspond par "rien" et regarder s'il reste quelque chose en final

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/sh
    while true
    do
        echo "Votre chiffre ?"
        read nb
        reste=`echo $nb |sed –e "s/[0-9]//g" –e "s/\.//" –e "s/^-//"`
        test -z "$reste" && break
     
        echo "$nb n'est pas un nombre - Recommencez"
    done
     
    echo "Réponse: $nb"
    Et l'exemple le plus universel: déporter le contrôle à une fonction (donc modulable à l'infini) et tester simplement la fonction

    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
    #!/bin/sh
    verif()
    {
          .... tout le code complet qui vérifie $1 et fait en final:
          return 0 si ok
          return 1 si pas ok
    }
     
    while true
    do
        echo "Saisissez ce que vous voulez"
        read val
        verif "$val" && break   # Guillemets impératifs au cas où il y aurait un espace
     
        echo "$val ne correspond pas à ce qui est attendu - Recommencez"
    done
     
    echo "Réponse: $val"
    A partir de là...

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 467
    Points
    19 467
    Par défaut
    Avec des fonctions récursives et des "regex conditionnelles" :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    #!/bin/bash
    
    # Ici, on récupère l'entrée standard
    monTTY=$(tty)
    
    function _NOM() {
    read  -p "NOM : " nom
    if [[ ! "$nom" =~  ^[a-zA-Z]*$ ]]; then
    echo "Vous devez entrer un nom valide..."
    _NOM
    fi
    }
    function _PRENOM() {
    read  -p "PRENOM : " prenom
    if [[ ! "$prenom" =~  ^[a-zA-Z]*$ ]]; then
    echo "Vous devez entrer un prénom valide..."
    _PRENOM
    fi
    }
    function _DATE() {
    read -p "DATE DE NAISSANCE (jj/mm/aaaa) : " dT
    if [[ ! $dT =~ [0-9]{2}/[0-9]{2}/[0-9]{4} ]]; then
       _DATE
    else
       jj="${dT:0:2}"
       mm="${dT:3:2}"
       aaaa="${dT:6:4}"
    # Ici, on convertit la date en seconde, si c'est un nombre de neuf chiffres, c'est une date valide
       if [[ ! $(date -d "${mm}/${jj}/${aaaa}" +%s) =~ [0-9]{9} ]]; then
    # mais en fait, il y a un problème ici... pour les personnes nées avant le 04/03/1973
    #+ pour lesquelles la date de naissance en secondes ne sera pas sur neuf chiffres
          echo "Vous devez entrer une date valide..."
          _DATE
       fi
    fi
    }
    function _NBENF() {
    read -p "NOMBRE D'ENFANTS : " nbenf
    # Ici, on divise par un, si la même valeur est retournée, c'est un nombre
    if [ $(( nbenf / 1 )) != $nbenf ]; then
    echo "Vous devez entrer un nombre valide..."
    _NBENF
    fi
    }
    
    _NOM
    
    _PRENOM
    
    PS3="SEXE : "
    select SEXE in Masculin Féminin; do
    case $REPLY in
    1) sexe="Masculin"
    break;;
    2) sexe="Féminin"
    break;;
    esac
    done
    
    _DATE
    
    read -p "CIN :" cin
    
    _NBENF
    
    for ((cpt=1; $cpt <= $nbenf; cpt++))
      do
    ##  Ici, parce qu'on est dans une boucle, et donc un sous-shell,
    #+ il faut rediriger l'entrée standard vers read
         read -p "ID $cpt :" id <$monTTY
         echo "$id ">> idenf.temp
    done

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

Discussions similaires

  1. Controle de saisie sous linux shell bash
    Par Cesar1120 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 26/06/2015, 10h31
  2. Controler une saisie avec un masque
    Par minooo dans le forum JSF
    Réponses: 2
    Dernier message: 07/06/2011, 13h04
  3. controle de saisie avec scanf
    Par router_ dans le forum C
    Réponses: 9
    Dernier message: 30/06/2010, 20h15
  4. Controler une saisie avec un masque
    Par marinew dans le forum JSF
    Réponses: 3
    Dernier message: 24/10/2007, 15h39
  5. Réponses: 5
    Dernier message: 13/09/2006, 16h47

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