Rechercher : dans
Par :

[Shell]instruction while et tableau de valeurs

Dernière réponse le 16 jui 2009 à 15:31:05 Shadow_49, le 16 jui 2009 à 13:58:29 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [Shell]instruction while et tableau de valeurs » dans :
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
Décaler les éléments d'un tableau (Rotation) -Récursivité- VoirVoici une procédure récursive qui permet de décaler tous les éléments d’un tableau d’une position à droite à partir de la position p Procedure Decaler (Var t : Tab; p, n : integer); Begin If p
Tri Shell -Recursive- VoirVoici une procédure récursive qui permet de trier un tableau de n entiers en utilisant la méthode de tri Shell : Procedure Tri_Shell_Rec (Var t: TAB; n,h : integer); Var aux,i : integer; begin If h > 0 Then Begin If n > h...
Langage C++ - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
Javascript - Les tableaux VoirIntroduction à la notion de tableau Les variables de Javascript ne permettent de stocker qu'une seule donnée à la fois. Or, étant donné qu'il est souvent utile de manipuler de nombreuses données, le concept de variable se révéle parfois...
PHP - Structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (le PHP associe le mot clé true à 1...

1

jipicy, le 16 jui 2009 à 14:14:29

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
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

2

Shadow_49, le 16 jui 2009 à 14:24:28

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

Répondre à Shadow_49

3

jipicy, le 16 jui 2009 à 14:35:17

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
$ man woman
Il n'y a pas de page de manuel pour woman.
Pour le "if" il faut savoir que la variable "$?" contient le code retour de la dernière commande effectuée, donc soit "0" (zéro) pour vrai et "1" (un) pour faux. Donc on teste la valeur de ce code retour, et s'il est faux (1) on relance la boucle (continue).

Répondre à jipicy

4

Shadow_49, le 16 jui 2009 à 15:07:15

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

Répondre à Shadow_49

5

 Shadow_49, le 16 jui 2009 à 15:31:05

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)

Répondre à Shadow_49