Script shell unix

Résolu
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. Modérateur
    Attention !!! Dans le script ci-dessous, la syntaxe du test entre crochets doit être écrite sans l'espace entre les deux premiers crochets ouvrants. Ici j'y suis obligé à cause de la syntaxe employée par CCM pour l'emploi des doubles crochets ;-((
    $ cat couleurs.txt    # fichier externe contenant les couleurs et leur code
    Couleur : verte Code : 1
    Couleur : jaune Code : 2
    Couleur : rouge Code : 3
    $ cat foo.ksh     # script en korn shell
    #! /bin/ksh
    
    clear
    
    while :
    do
    echo "Choisissez une ou 2 valeur(s) maximum\nséparées par une virgule (ex : 1,2)\n"
    cat -n couleurs.txt
    echo
    read choix
    if [ [ "$choix" = "" ]]
    then
    echo "Vous devez choisir au moins une valeur... recommencez s'il vous plaît.\n"
    continue
    fi
    IFS=,
    set $(echo "$choix")
    if (( "$#" > 2 ))
    then
    echo "Vous ne pouvez choisir que 2 valeurs maximum... recommencez s'il vous plaît.\n"
    continue
    fi
    break
    done
    
    set -A tableau $(
    for i in "$@"
    do
    awk -F" " 'NR=='"$i"' { printf "%s %d ",$3,$6 }' couleurs.txt
    done)
    
    echo "Paramètres du tableau = ${tableau[*]}"
    
    $
    L'exécution :
    $ ./foo.ksh
    Choisissez une ou 2 valeur(s) maximum
    séparées par une virgule (ex : 1,2)
    
         1  Couleur : verte Code : 1
         2  Couleur : jaune Code : 2
         3  Couleur : rouge Code : 3
    
      <<<<   # Aucune valeur n'est saisie
    
    Vous devez choisir au moins une valeur... recommencez s'il vous plaît.
    
    Choisissez une ou 2 valeur(s) maximum
    séparées par une virgule (ex : 1,2)
    
         1  Couleur : verte Code : 1
         2  Couleur : jaune Code : 2
         3  Couleur : rouge Code : 3
    
    1,3,2
    Vous ne pouvez choisir que 2 valeurs maximum... recommencez s'il vous plaît.
    
    Choisissez une ou 2 valeur(s) maximum
    séparées par une virgule (ex : 1,2)
    
         1  Couleur : verte Code : 1
         2  Couleur : jaune Code : 2
         3  Couleur : rouge Code : 3
    
    3,1
    Paramètres du tableau = rouge 3 verte 1
    $
    ;-))
    1. 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]$//")
      1. Contributeur
        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]}
        
        
        1. Contributeur
          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 ^^).
          1. j'ai bon essayé de chercher mais je ne trouve pas l'équivalent du read -a en korn shell :(
            1. 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
              1. Contributeur
                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]}
                

                1. 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 :)
                  1. Modérateur
                    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]}"
                    ;-))
                    1. Résultat attendu au niveau du tableau pour le choix 1,3 par exemple :

                      tab=verte,1,rouge,3

                      Merci d'avance.
                      1. 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)
                        1. 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 :(
                          1. c'est pas trés claire, j'ai pas saisi le but de ton script à part le fait de (1,2) ou autre :(
                            1. Contributeur
                              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
                          • 1
                          • 2