Questo è il mio menù, si gestisce con un file di configurazione ( allegato in coda) può lavorare sia con dialog che con testo semplice, La sua invocazione può essere nidificata.
Ah questo lo uso sotto solaris ma essendo per bash deve funzionare anche su linux. Verifica il path della shell.
menu.sh
#!/bin/bash
# menuprg - Copyright (C) 2005 Alessandro Celli <
acelli@interfree.it>
#---- MODIFICABILI ----------------------------------------------
CONFIG_FILE="$HOME/.menu.cfg"
ENABLE_DEBUG="0"
#---- DEBUG -----------------------------------------------------
[ "$ENABLE_DEBUG" -eq "1" ] && set -x
#---- VARIABILI GLOBALI -----------------------------------------
TITOLO=""
MESSAGGIO=""
ETICHETTA_ESCI=""
SCELTA="-1"
SCELTA_PROMPT="> "
CICLO_INFINITO="yes"
STILE="text"
ETICHETTA_KEYCONTINUE="Premi invio per continuare"
ATTIVA_KEYCONTINUE="no"
QUIT_OPTION="-1"
NUM_COMANDI=0
declare -a ETICHETTE
declare -a COMANDI
#---- COSTANTI --------------------------------------------------
BAD_CFG_FILE=1
BAD_CHOICE=2
BAD_MENU_STYLE=3
UNRECOGNIZE_ERROR=10
#---- FUNZIONI --------------------------------------------------
print_error_and_exit() {
[ "$ENABLE_DEBUG" -eq "1" ] && set +x
case $1 in
$BAD_CONFIG_FILENAME)
echo "Il file $CONFIG_FILE non è un file valido o non esiste"
exit $BAD_CONFIG_FILENAME
;;
$BAD_CFG_FILE)
echo -e "Attenzione il file di configurazione contiene un errore"
echo -e "alla riga $NUM_COMANDI"
exit $BAD_CFG_FILE
;;
$BAD_CHOICE)
echo -e "Opzione non valida."
exit $BAD_CHOICE
;;
$BAD_MENU_STYLE)
echo -e "Lo stile specificato per il menù non è corretto"
exit $BAD_MENU_STYLE
;;
*)
echo -e "Attenzione si è verificato un errore sconosciuto."
exit $UNRECOGNIZE_ERROR
;;
esac
[ "$ENABLE_DEBUG" -eq "1" ] && set -x
}
print_use_and_exit() {
[ "$ENABLE_DEBUG" -eq "1" ] && set +x
echo "Usage:\n$0 [-h] [-c <configfile>]"
echo "h) Stampa a video questa descrizione."
echo "c) Consente di specificare un file di configurazione diverso da quello di default ($CONFIG_FILE)"
exit 0
[ "$ENABLE_DEBUG" -eq "1" ] && set -x
}
print_keycontinue() {
local key=""
echo "$ETICHETTA_KEYCONTINUE"
read key
}
# Si incarica di impostare le variabili globali leggendo
# la configurazione dal file.
leggiConfigurazione() {
local ETICHETTA=""
local COMANDO=""
local RIGA=""
local NUM_RIGHE=`wc -l <$CONFIG_FILE`
for (( i=NUM_RIGHE ; i>=1 ; i=i-1 )) ; do
riga=`/usr/xpg4/bin/tail -n $i $CONFIG_FILE | head -1`
#IFS=";"
riga=`echo "$riga" | /usr/xpg4/bin/awk -F "#" '{ print $1 }'`
# Se la riga contiene solo un commento o una riga vuota salto alla
# riga successiva...
[ -z "$riga" ] || [ "$riga" = "#" ] && continue
# Altrimenti ne effettuo il parsing
ETICHETTA=`echo "$riga" | /usr/xpg4/bin/awk -F "=" '{ print $1 }'`
COMANDO=`echo "$riga" | /usr/xpg4/bin/awk -F "=" '{ print $2 }'`
# Se il formato della riga non e' corretto esco e segnalo l'errore
[ -z "$ETICHETTA" ] || [ -z "$COMANDO" ] && print_error_and_exit $BAD_CFG_FILE
# Altrimenti aggiorno le variabili globali
case $ETICHETTA in
prompt)
SCELTA_PROMPT=$COMANDO
;;
title)
TITOLO=$COMANDO
;;
message)
MESSAGGIO=$COMANDO
;;
quitlabel)
ETICHETTA_ESCI=$COMANDO
;;
loop)
CICLO_INFINITO=$COMANDO
;;
style)
STILE=$COMANDO
;;
label_keycontinue)
ETICHETTA_KEYCONTINUE=$COMANDO
;;
enable_keycontinue)
ATTIVA_KEYCONTINUE=$COMANDO
;;
*)
ETICHETTE[$NUM_COMANDI]=$ETICHETTA
COMANDI[$NUM_COMANDI]=$COMANDO
let NUM_COMANDI=$NUM_COMANDI+1
;;
esac
done
}
mostraConfigurazione() {
[ "$ENABLE_DEBUG" -eq "1" ] && set -x
echo -e "CONFIG_FILE=$CONFIG_FILE"
echo -e "TITOLO=$TITOLO"
echo -e "MESSAGGIO=$MESSAGGIO"
echo -e "ETICHETTA_ESCI=$ETICHETTA_ESCI"
echo -e "NUM_COMANDI=$NUM_COMANDI"
echo -e "CICLO_INFINITO=$CICLO_INFINITO"
echo -e "STILE=$STILE"
i=0
while ([ "$i" -lt "$NUM_COMANDI" ]) do
ee=${ETICHETTE["$i"]}
cc=${COMANDI["$i"]}
echo -e "ETICHETTE[$i]=$ee - COMANDI[$i]=$cc"
let i=i+1
done
[ "$ENABLE_DEBUG" -eq "1" ] && set +x
}
generaMenuTesto() {
local cont=0
local lung=`echo $TITOLO | wc -c`
local ee=""
clear
echo -e "$TITOLO"
while ([ "$cont" -lt "$lung" ]) do
echo -n "-"
let cont=cont+1
done
echo -e "\n$MESSAGGIO\n"
cont=0
while ([ "$cont" -lt "$NUM_COMANDI" ]) do
ee=${ETICHETTE[$cont]}
let cont=cont+1
echo -e "${cont}) $ee"
done
let cont=${NUM_COMANDI}+1
echo -e "${cont}) $ETICHETTA_ESCI"
}
leggiComandoTesto() {
[ "$ENABLE_DEBUG" -eq "1" ] && set -x
local select_option=0;
local COMANDO
let QUIT_OPTION=$NUM_COMANDI+1
let select_option=$NUM_COMANDI-1
echo -n "$SCELTA_PROMPT" ;
read SCELTA
[ "$SCELTA" -lt "1" ] || [ "$SCELTA" -gt "$QUIT_OPTION" ] && print_error_and_exit $BAD_CHOICE
# Eseguo l'operazione corrispondente
[ "$ENABLE_DEBUG" -eq "1" ] && set +x
}
eseguiComando(){
[ "$ENABLE_DEBUG" -eq "1" ] && set -x
# Eseguo l'operazione corrispondente
case $SCELTA in
$QUIT_OPTION) # Scelta quit
[ "$ENABLE_DEBUG" -eq "1" ] && echo "Quit !"
exit 0
;;
*)
let SCELTA=$SCELTA-1
COMANDO=${COMANDI[$SCELTA]}
eval $COMANDO
;;
esac
[ "$ENABLE_DEBUG" -eq "1" ] && set +x
}
menuDialog() {
# Per generare il menu richiamo il comando dialog con la sintassi:
# dialog --menu <text> <height> <width> <menu height> <tag1> <item1>...
[ "$ENABLE_DEBUG" -eq "1" ] && set -x
local cont=0
local ee=""
local dialog_options=""
local scelta=0
while ([ "$cont" -lt "$NUM_COMANDI" ]) do
# Leggo l'etichetta
ee=${ETICHETTE[$cont]}
# Incremento il contatore
let cont=cont+1
# Preparo la stringa per l'output dei comandi
dialog_options="$dialog_options ${cont} \"$ee\""
done
dialog=`which dialog`
let QUIT_OPTION=cont+1
[ "$ENABLE_DEBUG" -eq "1" ] && echo "QUIT_OPTION=$QUIT_OPTION"
# creo il menù
dialog="$dialog --no-cancel --menu \"$TITOLO\" 0 0 0 $dialog_options $QUIT_OPTION \"$ETICHETTA_ESCI\""
eval "$dialog 2>/tmp/dialog$$.out"
# prelevo il risultato
SCELTA="`cat /tmp/dialog$$.out`"
rm /tmp/dialog$$.out
[ "$SCELTA" == "" ] && SCELTA=$QUIT_OPTION
[ "$ENABLE_DEBUG" -eq "1" ] && set +x
}
#---- MAIN PROGRAM ----------------------------------------------
OPTIND=1
while getopts :c:h OPZIONE
do
case $OPZIONE in
h)
print_use_and_exit
;;
c)
CONFIG_FILE=$OPTARG
;;
esac
done
# Verifico l'esistenza del file di configurazione altrimenti blocco l'esecuzione del menu
[ ! -f $CONFIG_FILE ] && print_error_and_exit $BAD_CONFIG_FILENAME
leggiConfigurazione
#mostraConfigurazione
while (true) do
case $STILE in
text)
generaMenuTesto
leggiComandoTesto
;;
dialog)
menuDialog
;;
*)
print_error_and_exit $BAD_MENU_STYLE
;;
esac
eseguiComando
if [ "$CICLO_INFINITO" == "yes" ] ; then
[ "$ATTIVA_KEYCONTINUE" == "yes" ] && print_keycontinue
else
exit 0
fi
done
[ "$ENABLE_DEBUG" -eq "1" ] && set +x #Debug
File di configurazione:
#----------------------------------------------------------
# Esempio file di configurazione per il menu'
#----------------------------------------------------------
#---- Parametri globali -----------------------------------
# Tipo di menu. i valori ammessi sono:
# - text: Menu di testo
# - dialog: Menu in modalita' grafica ascii. richiede il comando display installato.
style=dialog
# Prompt visualizzato dal menu di scelta in modalita' testo
prompt=-->
# Titolo del menu'
title=Amministrazione istanza ${TWO_TASK} (${LOGNAME}@`hostname`)
# Messaggio globale visualizzato sotto il titolo del menu
message=messaggio di esempio
# Etichetta per l'opzione di uscita dal menu
quitlabel=Esci
# Il parametro loop consente di specificare se il menu si esegue una sola volta
# o se si ripete all'infinito finche' non viene selezionata l'opzione di uscita.
# i valori ammessi sono yes e no
loop=yes
# Specifica se attivare il supporto alla pressione del tasto invio dopo l'esecuzione di un comando
enable_keycontinue=yes
# Etichetta da visualizzare se occorre premere il tasto invio dopo l'esecuzione di un comando
label_keycontinue=Premere il tasto invio per continuare...
# Per creare un sotto menu scrivere come comando "$0 -c <file di configurazione>"
#---- Comandi ---------------------------------------------
#Elenco dei comandi con le relative etichette
#esempio ls=ls -l /tmp
#Esempio submenu=$0 -c ./menu2.cfg
# Stop e start del database
Stop database=$HOME/scripts/stopall.sh
Start database=$HOME/scripts/startall.sh
Spero possa esserti utile.