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

Shell et commandes GNU Discussion :

Controle saisie utilisateur


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut Controle saisie utilisateur
    Bonjour,
    Je cherche a contrôler la saisie de l'utilisateur.
    J'ai trouvé ça de Sve@r du 19/04/2009
    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"
    J'aimerais faire uniquement un test sans boucle du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    echo "Réponse O/N ?"
    read rep
    [ "$rep" = [oO]* ] && echo good || echo bad
    mais j'obtiens toujours bad.
    La notation [oO]* n'est pas valable dans le test?
    Merci
    ctac_

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ [[ "$rep" =~ [oO]* ]] && echo good || echo bad
    good
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Bonjour,
    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ [[ "$rep" =~ [oO]* ]] && echo good || echo bad
    good
    Euh...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ rep=non
    $ [[ "$rep" =~ [oO]* ]] && echo good || echo bad
    good
    Cordialement.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Merci pour la réponse.
    ça fonctionne avec bash (#!/bin/bash) mais pas avec dash (#!/bin/sh)
    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
    while true
    do
        echo "Réponse O/N ?"
        read rep
    [[ "$rep" =~ [oO]* ]] && echo good || echo bad
        case $rep in
             [oO]*)
    echo $rep
                    rep=o
                    break
                    ;;
             [nN][oO][nN] | [nN])
                    rep=n
                    break
                    ;;
             *) echo "Mauvaire réponse - Recommencez"
        esac
    done
     
    echo "Réponse: $rep"
    j'obtient ça d'abord avec dash puis avec bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    alain@debian:~/Documents/Script_bash$ ./testfonction.sh
    Réponse O/N ?
    o
    ./testfonction.sh: 8: ./testfonction.sh: [[: not found
    bad
    o
    Réponse: o
    alain@debian:~/Documents/Script_bash$ ./testfonction.sh
    Réponse O/N ?
    o
    good
    o
    Réponse: o
    ctac_

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Tout shell (enfin je crois ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    expr "$rep" : [oO] >/dev/null && echo good || echo bad
    Cordialement.

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut


    Au temps pour moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ rep='non'; [[ "$rep" =~ ^[oO]+ ]] && echo good || echo bad
    bad
    $ rep='n'; [[ "$rep" =~ ^[oO]+ ]] && echo good || echo bad
    bad
    $ rep='o'; [[ "$rep" =~ ^[oO]+ ]] && echo good || echo bad
    good
    $ rep='oui'; [[ "$rep" =~ ^[oO]+ ]] && echo good || echo bad
    good
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Citation Envoyé par ctac_
    ça fonctionne avec bash (#!/bin/bash) mais pas avec dash (#!/bin/sh)
    bash != dash

    dash tend à être POSIX, mais il contient quelques extensions.

    bash est compatible POSIX : un script POSIX fonctionnera avec bash, mais pas le contraire.

    [[ n'est pas POSIX.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Merci a tous pour vos réponses bien que je n'ai pas trouvé ma réponse.
    Je pensais pouvoir utiliser les expressions type RE dans les tests (comme avec case) mais ce n'est pas possible apparemment.
    je voulais essayer de remplacer expr dans cette ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	[ $(expr "$reponse" : '[yY]') != 1 ] && exit
    ps pour N_BaH
    Citation Envoyé par N_BaH
    bash est compatible POSIX : un script POSIX fonctionnera avec bash, mais pas le contraire.
    euh c'est quoi le contraire : un script bash fonctionnera avec POSIX
    [[ n'est pas POSIX. mais ça fonctionne avec bash ?
    C'est bien, ça rajoute un peu de confusion dans ma tete.
    Cordialement
    ctac_

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    la norme POSIX (en ce concerne le shell, parce qu'elle définit beaucoup plus de choses) définit le minimum qu'un interpréteur de commande doit comporter comme fonctionnalités, commandes, variables...
    c'est un minimum !

    bash fait davantage, [[ entre autres.
    donc un script qui n'utilise que le minimum requis par la norme POSIX, sera exécuté sans problème par bash.
    par contre, les fonctionnalités ajoutées dans bash ne peuvent pas fonctionner dans l'environnement restreint d'un shell plus proche de la norme POSIX, comme dash.

    très simplistement (et un peu faussement) :

    POSIX < dash < bash < ksh < zsh

    où "<" voudrait dire «peut être exécuter par»

    NB:
    case n'utilise pas de REGEX, mais le développement de chemins.
    expr est une commande externe. Si case fonctionne pourquoi utiliser autre chose ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Citation Envoyé par ctac_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	[ $(expr "$reponse" : '[yY]') != 1 ] && exit
    Je ne suis pas sûr de ce que tu veux faire par cette instruction. La façon 'simple' est de récupérer le résultat de expr et d'en tirer les conclusions:
    commande_test && commande_si_bon || commande_si_mauvais (attention: commande_si_bon ne doit pas renvoyer faux, donc renvoyer un code erreur)

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ rep="non"; expr $rep : ^[oO] >/dev/null && echo OK || echo KO
    KO
    $ rep="oui"; expr $rep : ^[oO] >/dev/null && echo OK || echo KO
    OK
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    C'est vrai que le exit est un peu sec ici.
    Finalement, j'ai opté pour le case.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if [ -e "$tempfile" ] ; then
    	echo -n ${tempfile##*/} existe deja !
    	echo " Voulez vous le remplacer ?"
    	echo -n 'entrer y or n puis Enter ---> votre choix : ' 
    	read reponse
    #	[ $(expr "$reponse" : '[yY]') != 1 ] && exit
    	case $reponse in
    		[yY]*) ;;
    		*) { echo "opération annulée" ; exit ;}
    	esac
    	> "$tempfile"
    fi
    Il semblerai d'après mes lectures et mes essais que le ^ soit implicite avec expr.
    Cordialement.
    ctac_

Discussions similaires

  1. controle saisie date utilisateur
    Par cath2123 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/10/2009, 11h29
  2. [C#.NET] Controle Saisie cellule du Datagrid
    Par lefebvse dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/04/2005, 14h56
  3. controle saisie
    Par star_light dans le forum C++
    Réponses: 14
    Dernier message: 15/03/2005, 19h19
  4. [langage] fin de saisie utilisateur
    Par Kinethe dans le forum Langage
    Réponses: 4
    Dernier message: 24/06/2004, 14h19
  5. [langage] saisie utilisateur
    Par caro_du_94 dans le forum Langage
    Réponses: 13
    Dernier message: 03/06/2004, 18h05

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