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 POSIX Discussion :

Existe-t-il un équivalent au IN ?


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Par défaut Existe-t-il un équivalent au IN ?
    Bonjour,

    imaginez un array qui stocke les valeurs saisies d'un utilisateur sur l'entrée standard. J'attends de l'utilisateur un choix parmi 4 valeurs distinctes. Cet array ne doit donc stocker au maximum que 4 valeurs.

    Mais je dois pouvoir tester les erreurs suivantes :
    - il ne renseigne rien. Dans ce cas j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    RET_cube=${#cube[*]}
    if [ $RET_cube == 0 ]; then
      echo "!!!!!! Veuillez selectionner au moins un cube !!!!!!!\n"
      exit;
    Cette première partie fonctionne.

    - C'est sur le test suivant qu'il plante. Imaginons qu'il renseigne une ou plusieurs valeurs mais qui ne sont pas celles que j'attends. Et c'est la que je ne sais pas faire. Je pensais que
    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
    #Test : l'utilisateur n'a rien renseigné
    RET_cube=${#cube[*]}
    if [ $RET_cube == 0 ]; then
      echo "!!!!!! Veuillez selectionner au moins un cube !!!!!!!\n"
      exit;
    else
    # Test : l'utilisateur a répondu correctement ?
      for i in ${cube[@]}; do
        if ([ ${cube[@]} == F || E || M || Q ]); then 
          verif="OK"
          echo "le resultat est : $verif"
        else
          verif="KO"
          echo "le resultat est : $verif"
        fi
      done
    fi
    ou (c'est la seule ligne 9 qui change entre les 2 versions)
    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
    #Test : l'utilisateur n'a rien renseigné
    RET_cube=${#cube[*]}
    if [ $RET_cube == 0 ]; then
      echo "!!!!!! Veuillez selectionner au moins un cube !!!!!!!\n"
      exit;
    else
    # Test : l'utilisateur a répondu correctement ?
      for i in ${cube[@]}; do
        if ([ ${cube[@]} == F ] || [ ${cube[@]} == E ] || [ ${cube[@]} == M ] || [ ${cube[@]} == Q ]); then 
          verif="OK"
          echo "le resultat est : $verif"
        else
          verif="KO"
          echo "le resultat est : $verif"
        fi
      done
    fi
    allait fonctionner mais non.... Je me prends des erreur dans la tronche

    Donc connaissez vous un equivalent au "IN" du SQL par exemple qui me permettrait de tester mon array sur ce point et en fonction du resultat lancerait une autre suite de commandes dans la même boucle ?

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Voici un petit exemple de la commande case:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ TOTO="titi"
    $ case $TOTO in
        tutu) echo ok ;;
        titi) echo nono ;;
        tata) echo po ;;
        *) echo NON ;;
    esac
    nono
    A la place des echo, tu peux mettre plusieurs commande pour un même cas. Ce qui indique la fin d'un cas est le ';;'

  3. #3
    Membre éclairé
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Par défaut
    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
    #Si la personne veut alimenter tous les cubes en une fois
    #changement de l'assignation de l'utilisateur par les
    #suffixes des cubes pour pouvoir boucler dessus
    if [ ${cube[0]} == * ]; then 
        echo "tous les cubes"
        #unset 'cube[0]'
        set -A cube F E M Q
        echo "${cube[*]}"
        exit;    
    fi    
    for i in ${cube[@]}
    do
      case "${cube[@]}" in 
        "F"|"E"|"M"|"Q")
          cd /home/ess_tms/temp/JTMS$i 
          touch creation_ok_$i.txt ;;
        "*") 
          echo "VA CHIER" ;;
      esac
    done
    exit;
    Une idée pourquoi lorsque je simule :
    - une entrée = "W" il ne me renvoit pas de "VA CHIER" ou de message d'erreur
    - 2 entrées "F" et "M" il ne me créé pas les fichiers sous les dossiers respectifs grâce à la boucle
    - 1 seule entrée tout fonctionne bien

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Je te laisse réfléchir à quoi peut bien servir ta boucle si tu ne l'exploite pas comme par exemple un petit $i dans le case au lieu de tout les argument du tableau...

  5. #5
    Membre éclairé
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Par défaut
    Ouais mais là moi je pige plus rien.
    Tu parles de ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i in ${cube[@]}
    do
      case "${cube[$i]}" in 
        "F"|"E"|"M"|"Q")
          cd /home/ess_tms/temp/JTMS$i 
          touch creation_ok_$i.txt ;;
        "*") 
          echo "VA CHIER" ;;
      esac
    done
    exit;
    Soit mais maintenant, plus rien ne fonctionne. Si je rentre "F" voilà le retour maintenant...
    Sélectionnez le ou les cube(s) que vo
    Pour JTMSF tapez F,
    Pour JTMSE tapez E,
    Pour JTMSM tapez M,
    Pour JTMSQ tapez Q,
    Tous les cubes tapez *,
    Une selection de cubes tapez les lett
    C'est à vous :
    F
    ./test5.ksh[29]: F: bad number
    [sxdess01:ess_tms]/home/ess_tms/shell

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Mais non, plus comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i in ${cube[@]}
    do
      case "$i" in 
        "F"|"E"|"M"|"Q")
          cd /home/ess_tms/temp/JTMS$i 
          touch creation_ok_$i.txt ;;
        "*") 
          echo "VA CHIER" ;;
      esac
    done
    exit;

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par mederik Voir le message
    (c'est la seule ligne 9 qui change entre les 2 versions)
    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
    #Test : l'utilisateur n'a rien renseigné
    RET_cube=${#cube[*]}
    if [ $RET_cube == 0 ]; then
      echo "!!!!!! Veuillez selectionner au moins un cube !!!!!!!\n"
      exit;
    else
    # Test : l'utilisateur a répondu correctement ?
      for i in ${cube[@]}; do
        if ([ ${cube[@]} == F ] || [ ${cube[@]} == E ] || [ ${cube[@]} == M ] || [ ${cube[@]} == Q ]); then 
          verif="OK"
          echo "le resultat est : $verif"
        else
          verif="KO"
          echo "le resultat est : $verif"
        fi
      done
    fi
    allait fonctionner mais non.... Je me prends des erreur dans la tronche
    Juste pour information, la (fameuse) ligne 9 contient plein d'erreurs ou de maladresses:
    - les parenthèses sont inutiles
    - pour la comparaison de chaines, il vaut mieux remplacer == par =
    - toute variable gagne à être entourée de guillemets (sauf raison valable (glob ou expression générique))

    La ligne 9 devrait donc plutôt être (ça devrait déjà éliminer des messages d'erreur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if [ "${cube[@]}" = "F" ] || [ "${cube[@]}" = "E" ] || [ "${cube[@]}" = "M" ] || [ "${cube[@]}" = "Q" ]; then
    sauf que tu ne veux pas comparer "${cube[@]}" qui est l'ensemble des valeurs, mais plutôt la valeur sur laquelle tu boucles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if [ "${i}" = "F" ] || [ "${i}" = "E" ] || [ "${i}" = "M" ] || [ "${i}" = "Q" ]; then
    ce que tu peux aussi abréger en (en utilisant la comparaison avec une expression générique):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if [[ "${i}" = [FEMQ] ]]; then # sans guillemets autour de [FEMQ]
    sinon le "case" proposé marche tout aussi bien!

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    On peut aussi passer par l'option "-o" de test, ce qui donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ "${i}" = "F" -o "${i}" = "E" -o "${i}" = "M" -o "${i}" = "Q" ]; then
    Bien sur dans le cas où l'on ne peut abréger la syntaxe...

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Tout à fait!
    et on peut aussi utiliser la syntaxe '||' du builtin test '[[' (de bash ou ksh):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ "${i}" = "F" || "${i}" = "E" || "${i}" = "M" || "${i}" = "Q" ]]; then

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/12/2005, 18h49
  2. Réponses: 3
    Dernier message: 18/10/2005, 01h39
  3. Existe-t-il un équivalent de terminal server pour Windows?
    Par kikica dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 27/08/2005, 18h09
  4. [T-SQL] existe-t-il un équivalent à EXIT ?
    Par Oluha dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/05/2005, 13h52
  5. Réponses: 1
    Dernier message: 17/01/2005, 16h33

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