Juin 152011
 

Testé sur HP-UX

veuillez vérifier le chemin de /bin/printf et /bin/echo

détection de la taille de l’écran.
affichage sans débordement à moins que l’un des choix soit lui même plus grand que le taille de cet écran.

cette fonction prend en argument un liste de valeur et retourne cette liste comme un menu.
ce menu sera adapté à la taille de votre terminal.

si la taille ne peut pas être détectée, l’affichage sera un choix par ligne.

if_error () {
        RVAL="${?}"
        if [ "${RVAL}" = "0" ]
                then
                        return 1
                else
                        printf "${1}\n"
                        V_NBERROR=$((${V_NBERROR}+1))
                        return 0
        fi
} # -- Fin de if_error --
 
Download : menu_choix.sh

#!/usr/bin/ksh
#
# vim:tabstop=3:syntax=sh:
#
# ---------
## Function: menu_choix
## Version : 0.2
## Objet   : Prend des valeurs et demande laquelle on veut utiliser.
##----------------------------------------------------------------------------
# 0.1 18-fev-09 - Creation : Cedrick GAILLARD
# 0.2 19-fev-09 - menu_choix affiche maintenant une liste de choix avec
#                 plusieurs elements par ligne.
# 0.3 12-mar-09 - ajout de la variable FORCE_NB_ELEM pour n'afficher que NB
#                 elements par ligne.
#                 si le nb d'elements a afficher est < ou = au nb d'element
#                 que l'on peut afficher, il apapraissent verticalement.
# 0.4 13-mar-09 - ajout de 'argument -d $DEFAULT
#                 prise en compte de la variable $QUIET
# 0.5 06-avr-09 - ajout de l'argument -f qui force la demande de choix meme
#                 s'il n'y a qu'un choix
#                 ajout de l'argument -c pour modifier le nombre de colonnes
#                 max que l'on doit afficher
#-----------------------------------------------------------------------------
 
menu_choix () {
   # pour forcer le nombre d'elements par ligne a afficher, decommenter la ligne suivante
   #FORCE_NB_ELEM=4

   while &#91; "$#" -ne "0" &#93;
   do
      case $1
      in
         -m)   INFO=$2
               shift 2
               ;;
         -f)   # Affiche le choix meme s'il n'y en a qu'un
               VIEW=true
               shift 1
               ;;
         -c)   if &#91; -n "$2" -a -n "$(echo $2 |egrep "^&#91;0-9&#93;*.&#91;0-9&#93;$")" &#93;
                  then
                     FORCE_NB_ELEM=$2
                     shift 2
                  else
                     shift
               fi
               ;;
         -d)   if &#91; -n "$2" -a "$(echo $2 |cut -c1)" != "-" &#93;
                  then
                     DEFAULT=$2
                     shift 2
                  else
                     DEFAULT=
                     shift
               fi
               ;;
         -l)   shift 1
               LISTE="${*}"
               break
               ;;
         *)    echo "Argument $1 non reconnu"
               return 1
               ;;
      esac
   done
 
   CHOIX=
 
   &#91; -z "$LISTE" &#93; && return 1
   &#91; "$(echo $LISTE |wc -w)" -eq "1" -a "$VIEW" != "true" &#93; && {
      CHOIX=$LISTE
      return 0
   }
 
   while true
   do
      NB=0
      SIZE=0
      MESSAGE=
      MSG=
      unset TABLEAU
 
      echo ""
      echo "$INFO"
 
      for i in $LISTE
      do
         MESSAGE="$NB) $i"
 
         # La taille du message le plus grand
         M_SIZE="$(expr length "${MESSAGE}")"
         &#91; "$M_SIZE" -gt "$SIZE" &#93; && SIZE="$M_SIZE"
 
         # La liste a afficher, un choix par ligne par defaut
         MSG="$(/bin/printf "${MSG}\n${MESSAGE}")"
 
         TABLEAU&#91;$NB&#93;=$i
         NB="$(( $NB + 1 ))"
      done
 
      # Pour afficher une liste de choix adaptee a l'ecran
      if &#91; "$(tty >/dev/null ; echo $?)" = "0" ]
         then
            COLS="$(tput cols)"
 
            if [ "$?" != "0" -o -n "$(echo ${COLS} |sed 's/[0-9]//g')" ]
               then
                  echo "${MSG}"
               else
                  # On veut ajouter 4 espaces ente chaque message
                  SIZE="$(( $SIZE + 4 ))"
 
                  # Le nombre d'elememnt par ligne
                  if [ -n "$FORCE_NB_ELEM" -a "$FORCE_NB_ELEM" -gt "0" ]
                     then
                        ELEM=$FORCE_NB_ELEM
                     else
                        ELEM="$(echo "$COLS / $SIZE" |bc)"
                  fi
 
                  # On affiche les choix
                  if [ "$(echo "${MSG}" |grep -v "^$" |wc -l)" -le "$ELEM" ]
                     then
                        echo "${MSG}"
                     else
                        X=0
                        echo "${MSG}" |grep -v "^$" |while read line
                        do
                           [ "$X" -eq "$ELEM" ] && {
                              X=0
                              echo
                           }
 
                           SIZE_MSG="$(expr length "${line}")"
                           SPACE=
                           while [ "$SIZE_MSG" -ne "$SIZE" ]
                           do
                              SPACE="$SPACE "
                              SIZE_MSG="$(( $SIZE_MSG + 1 ))"
                           done
                           /bin/printf "${line}${SPACE}"
                           X="$(( $X + 1 ))"
                        done
                  fi
            fi
         else
            echo "${MSG}"
      fi
 
      echo
 
      read CHOIX?"> "
 
      [ -n "$CHOIX" -a -z "$(echo $CHOIX |tr -d "[0-9]")" ]
      if_error "Choisir une valeur dans la liste" && continue
 
      [ "$CHOIX" -lt "${#TABLEAU[*]}" ]
      if_error "Reponse incorrecte" && continue
 
      CHOIX="${TABLEAU[$CHOIX]}"
 
      [ -n "$CHOIX" ] && break
   done
 
} # -- Fin menu_choix --

exemple d’utilisation:

$ exec ksh
$ . /development/functions/menu_choix
$ menu_choix \
> -m "Select Target System : " \
> -l RP2405 RP3440 RP4440 RP7410 RX1620 RX2600 RX2620 RX2660 RX3600 RX4640 RX6600 RX7620 RX8620 RX8640 C3000 J2240 J5000 J5600 J6000 J6700 J7000
 
Select Target System :
0) RP2405     1) RP3440     2) RP4440     3) RP7410     4) RX1620     5) RX2600     6) RX2620     7) RX2660     8) RX3600     9) RX4640
10) RX6600    11) RX7620    12) RX8620    13) RX8640    14) C3000     15) J2240     16) J5000     17) J5600     18) J6000     19) J6700
20) J7000
> 20
$ echo $CHOIX
J7000


 Laisser un commentaire

Vous pouvez utiliser ces tags et attributs HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(requis)

(requis)

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.