Script shell unix

Résolu
simo -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
Mon problème est comme suit: J'ai un prompt invitant l'utilisateur à faire son choix parmi plusieurs choix lus à partir d'un fichier, je voudrai limiter le choix de l'utilisateur à seulement et seulement deux choix et récupérer en paramètres les choix choisis.

Exemple :

1. Couleur : verte Code : 1
2. Couleur : jaune Code : 2
3. Couleur : rouge Code : 3

Votre choix :

Les paramètres (verte, 1) et (jaune, 2) et (rouge,3) représente lors de l'affichage les paramètres $2 et $4.
Si l'utilisateur choisit les options 1 et 3 un tableau tab[i] devrait se remplir avec les paramètres (verte,1,rouge,3)
Le choix doit se limiter à deux choix obligatoireemnt : exemple : 1,3 ou 1,2 ou 2,3

Merci d'avance pour votre aide.
Configuration: Windows XP
Internet Explorer 7.0

21 réponses

  • 1
  • 2
  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Salut
    Essaie :
    #! /bin/sh
    
    a=null
    while [ "$a" ] || [ ! "$choix" ]; do
       echo "choix:"
       read "choix"
       a=$(echo $choix | sed 's/[1-3],[1-3]//')
    done
    echo "bravo"
    

    Cdt
    0
  2. simo
     
    c'est pas trés claire, j'ai pas saisi le but de ton script à part le fait de (1,2) ou autre :(
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Bah mon script répond à tes besoins ^^.
      Grosso modo, ça demande le choix a l'utilisateur. Ensuite, la réponse de l'utilisateur va passer dans sed, et effacer toutes les réponses de la forme "[1-3],[1-3]" ([1-3]= n'importe quel chiffre entre 1 et 3 compris). Et on stocke le résultat dans la variable $a.
      A ce stade, si $a vaut "", c'est que la réponse est bien de la forme que tu voulais.
      Cdt
      0
  3. simo
     
    Oui fiddy, il répond en parti à mon besoin. il répond juste au choix du type (x,y) mais il reste la partie stockage des paramètres en tableau :(
    0
  4. simo
     
    Est ce qu'il est possible de faire un choix de 1 u type (1) ou (3) .. ou de 2 choix dy type (1,2) ou (1,7) ... et que ca ne soit pas limité au nombre 3 (çad limité le choix aux nombres entiers)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. simo
     
    Résultat attendu au niveau du tableau pour le choix 1,3 par exemple :

    tab=verte,1,rouge,3

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

    Et ça, ça ta va ?
    ./foo.sh
    
    Choisissez 2 couleurs :
    
    1. Couleur : verte Code : 1
    2. Couleur : jaune Code : 2
    3. Couleur : rouge Code : 3
    
    2
    
    Mauvais choix, 2 couleurs seulement doivent être choisies...
    Recommencez s'il vous plaît.
    
    
    Choisissez 2 couleurs :
    
    1. Couleur : verte Code : 1
    2. Couleur : jaune Code : 2
    3. Couleur : rouge Code : 3
    
    3 1
    
    Deux couleurs ont été choisies ;-))
    
    tableau = rouge 3 verte 1
    1ère valeur tableau = rouge
    2ème valeur tableau = 3
    3ème valeur tableau = verte
    4ème valeur tableau = 1
    
    [tmpfs]$
    Le script :
    #! /bin/bash
    
    set "verte 1" "jaune 2" "rouge 3"
    
    while :
    do
    echo
    echo "Choisissez 2 couleurs :"
    echo
    echo "1. Couleur : verte Code : 1
    2. Couleur : jaune Code : 2
    3. Couleur : rouge Code : 3"
    echo
    read -a color
    if [ "${#color[*]}" != "2" ]
    then echo
    echo "Mauvais choix, 2 couleurs seulement doivent être choisies..."
    echo "Recommencez s'il vous plaît."
    echo
    continue
    else break
    fi
    done
    echo
    echo "Deux couleurs ont été choisies ;-))"
    echo
    
    tableau=( $(eval echo \$${color[0]} \$${color[1]}) )
    echo "tableau = ${tableau[*]}"
    echo "1ère valeur tableau = ${tableau[0]}"
    echo "2ème valeur tableau = ${tableau[1]}"
    echo "3ème valeur tableau = ${tableau[2]}"
    echo "4ème valeur tableau = ${tableau[3]}"
    ;-))
    0
  8. simo
     
    Bonjour jipicy,
    merci pour la solution :). Est il possible de rendre le choix comme suit : 1,2 (virgule au lieu de l'espace)? et de donner la possiblité à l'utilisateur de faire 1 ou 2 choix seulement?
    exemple :

    Choisissez couleurs :

    1. Couleur : verte Code : 1
    2. Couleur : jaune Code : 2
    3. Couleur : rouge Code : 3

    1

    Bon choix

    Choisissez couleurs :

    1. Couleur : verte Code : 1
    2. Couleur : jaune Code : 2
    3. Couleur : rouge Code : 3

    1,3

    Bon choix

    Choisissez couleurs :

    1. Couleur : verte Code : 1
    2. Couleur : jaune Code : 2
    3. Couleur : rouge Code : 3

    1,3,2

    Mauvais choix

    Merci d'avance :)
    0
  9. simo
     
    Le read -a ne marche pas en korn shell :(
    0
  10. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Re,
    Petit arrangement du script de jipicy et hop, ce script devrait te convenir ;)
    #! /bin/bash
    
    corresp[1]=verte
    corresp[2]=jaune
    corresp[3]=rouge
    
    a=null
    b=null
    
    while :
    do
    	echo
    	echo "Choisissez 2 couleurs :"
    	echo
    	echo "1. Couleur : verte Code : 1"
    	echo "2. Couleur : jaune Code : 2"
    	echo "3. Couleur : rouge Code : 3"
    	echo
    	read couleur
    	a=$(echo $couleur | sed 's/^[1-3],[1-3]$//')
    	b=$(echo $couleur | sed 's/^[1-3]$//')	
    	if [ ! "$b" ] && [ "$couleur" ]
    	then
    		tableau[1]=${couleur:0:1}
    		tableau[0]=${corresp[${tableau[1]}]}
    		break
    	elif [ ! "$a" ] && [ "$couleur" ]
    	then
    		tableau[1]=${couleur:0:1}
    		tableau[0]=${corresp[${tableau[1]}]}
    		tableau[3]=${couleur:2:1}
    		tableau[2]=${corresp[${tableau[3]}]}
    		break
    	else
    		echo "Mauvais choix, 1 ou 2 couleurs seulement doivent être choisies..."
    		echo "Recommencez s'il vous plaît."
    		echo
    	fi
    done
    echo "tableau = ${tableau[*]}"
    echo "1ère valeur tableau = ${tableau[0]}"
    echo "2ème valeur tableau = ${tableau[1]}"
    echo "3ème valeur tableau = ${tableau[2]}"
    echo "4ème valeur tableau = ${tableau[3]}
    

    0
  11. simo
     
    Le tableau ne devrait pas être limité par sa taille, il n'y a pas que 3 choix mais plusieurs.
    J'ai l'erreur suivante lors de l'execution en korn shell.
    tableau[1]=${couleur:0:1}: bad substitution

    Merci d'avance
    0
  12. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Ben je bloque aussi en ksh ;-((
    0
  13. simo
     
    j'ai bon essayé de chercher mais je ne trouve pas l'équivalent du read -a en korn shell :(
    0
  14. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Salut,
    Dans ma version, je n'utilise pas read -a ;)
    Remplace tableau[1]=${couleur:0:1} par tableau[1]=$(echo ${tableau[1]} | sed 's/\([1-3]\)/\1/')
    (Oui, je sais, c'est un peu bourrin ^^).
    0
  15. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Re,
    Voilà ton code arrangé. Tu peux modifier les couleurs en début. L'utilisateur ne peut mettre qu'une ou deux couleurs parmi celles définies. Normalement, ce code devrait marcher aussi en korn shell ;)
    #! /bin/bash
    
    #A changer
    corresp[1]=verte
    corresp[2]=jaune
    corresp[3]=rouge
    corresp[4]=noir
    ##
    
    nbCouleur=${#corresp[*]}
    a=null
    b=null
    while :
    do
    	i=1
    	while [ $i -le $nbCouleur ]; do
    		echo "$i : ${corresp[$i]}"
    		i=$(($i+1))
    	done
    	echo
    	read couleur
    
    
    	a=$(echo $couleur | sed "s/^[1-$nbCouleur],[1-$nbCouleur]$//")
    	b=$(echo $couleur | sed "s/^[1-$nbCouleur]$//")
    	choix=$(echo $couleur | sed "s/,\([1-$nbCouleur]\)/ \1/g")
    	if [ ! "$b" ] && [ "$couleur" ]
    	then
    		tableau[1]=$(echo $choix | cut -d' ' -f1)
    		tableau[0]=${corresp[${tableau[1]}]}
    		break
    	elif [ ! "$a" ] && [ "$couleur" ]
    	then
    		tableau[1]=$(echo $choix | cut -d' ' -f1)
    		tableau[0]=${corresp[${tableau[1]}]}
    		tableau[3]=$(echo $choix | cut -d' ' -f2)
    		tableau[2]=${corresp[${tableau[3]}]}
    		break
    	else
    		echo "Recommencez s'il vous plaît."
    		echo
    	fi
    done
    echo "tableau = ${tableau[*]}"
    echo "1ère valeur tableau = ${tableau[0]}"
    echo "2ème valeur tableau = ${tableau[1]}"
    echo "3ème valeur tableau = ${tableau[2]}"
    echo "4ème valeur tableau = ${tableau[3]}
    
    
    0
  16. simo
     
    Est ce que tu peux me commenter juste un peu le script pour que puisse le comprendre d'avantage :) surtout ces deux lignes
    a=$(echo $couleur | sed "s/^[1-$nbCouleur],[1-$nbCouleur]$//")
    b=$(echo $couleur | sed "s/^[1-$nbCouleur]$//")
    0
  • 1
  • 2