caso annidato in script bash
Domanda
Ho scritto la seguente funzione in uno script bash, ma non funziona. Mi sto perdendo qualcosa di ovvio?
main_menu() {
dialog \
--title "Sim Gateway Infomation Utility" \
--menu "What do you want to do?" 12 60 5 \
Summary "View overall summary" \
Details "View details of a sim bank" \
Modify "Modify used minutes of a sim" \
Exit "Exit" \
2>$tempfile
retval=$?
case retval in
0)
choice=`cat $tempfile`
case $choice in
Summary) summary;;
Details) details;;
Modify) modify;;
Exit) clean_up;;
esac
;;
1)
confirm_exit;;
255)
confirm_exit;;
esac
}
Soluzione
articolo discute dialog
; Non sto sperimentato con esso.
Il tuo 'case retval in
' ha bisogno di essere 'case $retval in
(o' case "$retval" in
).
[ @Idelic osserva che la mia risposta originale era più conservatore di necesssary. ]
La stringa 'retval' corrisponde nessuna delle opzioni che la lista nel tuo caso dichiarazione esterno (utilizzare l'opzione '*' per rilevare l'imprevisto). Le doppie virgolette prevenire gli incidenti se $retval
spazi sempre contenuta; in generale, è una buona idea di usare le virgolette attorno alla variabile nelle dichiarazioni case "$var" in
(e la maggior parte in altri luoghi troppo). In questo caso particolare, non avrebbe importanza; lo stato di uscita è sempre un numero. Nella dichiarazione 'case "$choice" in
', sarei più a suo agio con le virgolette attorno alla variabile - ma si può ancora essere al sicuro (che avevo bisogno di saperne di più su dialog
per essere sicuri di ciò che fa e se mai genera spazi - o niente addirittura).