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 [ "$#" -ne "0" ] 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 [ -n "$2" -a -n "$(echo $2 |egrep "^[0-9]*.[0-9]$")" ] then FORCE_NB_ELEM=$2 shift 2 else shift fi ;; -d) if [ -n "$2" -a "$(echo $2 |cut -c1)" != "-" ] then DEFAULT=$2 shift 2 else DEFAULT= shift fi ;; -l) shift 1 LISTE="${*}" break ;; *) echo "Argument $1 non reconnu" return 1 ;; esac done CHOIX= [ -z "$LISTE" ] && return 1 [ "$(echo $LISTE |wc -w)" -eq "1" -a "$VIEW" != "true" ] && { 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}")" [ "$M_SIZE" -gt "$SIZE" ] && SIZE="$M_SIZE" # La liste a afficher, un choix par ligne par defaut MSG="$(/bin/printf "${MSG}\n${MESSAGE}")" TABLEAU[$NB]=$i NB="$(( $NB + 1 ))" done # Pour afficher une liste de choix adaptee a l'ecran if [ "$(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