[Risolto] shell script menu per lanciare script

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
orso75
Linux 2.x
Linux 2.x
Messaggi: 218
Iscritto il: mar 31 mag 2005, 0:00
Località: Bologna

[Risolto] shell script menu per lanciare script

Messaggio da orso75 »

Salve a tutti
sto creandomi uno scrippettino per lanciare alcuni script di utilità che già uso.

il mio problema è il seguente:
con un costrutto case faccio la selezione dello script.
ma come lancio i vari miniscript?
script:
#SELEZIONARE APPLICATIVO
cod_util=30
stato="0"
while test "$stato" = "0"
do
clear
echo "\n"
echo " Operazioni Disponibili \n\n"
#
echo " 1) pippo"
echo " 2) pluto"
echo " 3) paperino"
echo " 4) minnie"
echo " 5) zio_paperone"
#Sono disponibili posizioni fino alla numero 28

echo " \n scegli \c"
read cod_util

case $cod_util in
1) Utility=/tools/dir/ippo/ppap/pippo.scirpt
stato="1" ;;
2) Uitility=
stato="1" ;;
3) Utility=
stato="1" ;;
4) Utility=
stato="1" ;;
5) Utitlity=
stato="1" ;;
*) cod_util=30
stato="0" ;;
esac
done
if [ "$stato" = "1" ]
then
$utility
echo "sono qui"
fi
exit

com posso lanciare lo script immagazzinato nella variabile $Utility?
sto continuando a leggere in giro, ma ancora non riesco..
mi fa vedere "sono qui" ma non lancia lo script.
suggerimenti ?

(DEVE ESSERE BANALE MA SONO IMBANANATO!!!!"

Grazie
Orso
Scusate, dopo una piccola pausa mi sono accorto che lanciavo
$utility invece di $Utility

:oops:

Avatar utente
aelsantex
Linux 0.x
Linux 0.x
Messaggi: 67
Iscritto il: sab 28 ago 2004, 0:00

Mio menu

Messaggio da aelsantex »

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.

Avatar utente
orso75
Linux 2.x
Linux 2.x
Messaggi: 218
Iscritto il: mar 31 mag 2005, 0:00
Località: Bologna

Messaggio da orso75 »

WOW
Sei andato molto oltre le mie competenze!!

ora cerco di capire come funziona e magari lo provo!!

PS: non lo uso in linux, ma in HPUX

grazie mille!!

Rispondi