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

