[Shell]instruction while et tableau de valeurs

Résolu
Shadow_49 Messages postés 13 Statut Membre -  
Shadow_49 Messages postés 13 Statut Membre -
Bonjour,

Je débute dans le scripting shell et j'ai besoin d'un petit coup de main, ne trouvant pas d'exemple de ce que je souhaite faire.

Je crée un tableau de données comme ceci :
tableau = (val1 val2 ... valN)

Ca c'est ok.

Maintenant, je pose une question à l'utilisateur et récupère sa réponse à l'aide de l'instruction read.

Je voudrais faire un truc du genre :
tant que $reponse n'est pas dans la liste des valeurs de $tableau
- je pose la question
- je liste les réponses possibles contenues dans $tableau
- je récupère la réponse avec read

J'ai essayé un truc de ce genre :
until [ saisie in ${tableau[@]} ];
do
instructions
done

mais il me renvoie l'erreur suivante :
[: too many arguments

Pouvez vous m'aider svp ?

Merci d'avance

5 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Une façon de faire :
    #! /bin/sh
    
    #set -xv
    
    TAB=( A B C D E )
    
    while :
    clear
    do
    for i in ${TAB[@]}
    do echo $i
    done
    read -p "Choisissez une valeur : " val
    grep -q ${val} <<<${TAB[@]}
    if [ "$?" = 1 ]
    then
    echo "Mauvais choix :-("
    sleep 2
    continue
    else
    echo "Bon choix, bye..."
    break
    fi
    done
    ;-))
    0
  2. Shadow_49 Messages postés 13 Statut Membre 1
     
    En effet cela marche mais en partie

    Par exemple, j'ai dans mon tableau val1 et val2
    si je ne saisis que va comme réponse il me dit que c'est bon quand même.

    que veut dire la condition du if s'il te plais ? (je débute en shell je ne connais pas du tout)

    Merci d'avance
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Modifie comme ceci :
    TAB=( val1 val2 val3 val4 val5 )
    
    while :
    clear
    do
    for i in ${TAB[@]}
    do echo "- $i"
    done
    read -p "Choisissez une valeur : " val
    grep -q "\b${val}\b" <<<${TAB[@]}
    if [ "$?" = 1 ]
    then
    echo "Mauvais choix :-("
    sleep 2
    continue
    else
    echo "Bon choix, bye..."
    break
    fi
    done
    0
  4. Shadow_49 Messages postés 13 Statut Membre 1
     
    Merci, ca marche bien avec val1 etc comme valeur.
    Maintenant (je vais parraître chiant !) j'ai comme valeur A4.6 et A4.6_64b (qui sont des versions de RH pour info) et si je ne met que AS4 ça marche alors que je ne l'ai pas dans mon tableau...

    Une idée ?

    Au passage, que veulent dire les \b et que veut dire le #? = 1 ?

    Merci d'avance
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Shadow_49 Messages postés 13 Statut Membre 1
     
    J'ai procédé autrement :

    available_versions="AS4.6 AS4.6_64b"
    os_version="_"
    validator="failed"

    while [ ${os_version} = "_" ]; do
    echo "Question 1 : "
    echo "Quel version de RedHat souhaitez vous installer parmis : "

    for version in ${available_versions}; do
    echo " - $version"
    done

    echo "(respectez bien les majuscules)"

    read os_version

    for choice in ${available_versions}; do
    if [ ${os_version} = $choice ]; then
    validator="success"
    break
    else
    validator="failed"
    fi
    done

    if [ ${validator} = "failed" ]; then
    os_version="_"
    echo "La version demandée n'est pas disponible. Toutes les versions disponibles sont affichées dans la liste"
    fi

    done

    Et ça marche pareil (même si c'est un peu plus long)
    0