Corrección de un script de shell

Corrección de un script de shell

Tengo una sección del script de shell que funcionaba antes pero ahora da resultados diferentes:

MSG=

 while  true
 do
    themenu
    getchar =

   case $answer in
       1) export_Config_tables;;
       2) export_config_tables_file;;
       3) export_Accounts_tables;;
       4) export_both_tables;;
       5) load_config_tables;;
       6) load_config_tables_file;;
      x|X) break;;
    q|Q) break;;
    d|D) toggle_debug;;
         *) badchoice;;

   esac
  done
clear

la función del menú:

themenu () {
clear
echo `date `
echo
echo " summit Data Extract utility   (SOPRA v1.1)"
echo
 echo
 echo  "1.  Extract summit configuration data only"    
 echo  "2.  Extract summit config data in flat files only"
 echo  "3.  Extract summit account data only"
 echo  "4.  Extract all data "
 echo  "5.  Load summit configuration data from Dump"    
 echo  "6.  Load summit config data from flat files only"
 echo
 echo
 echo  "x.  Exit"
 echo
 echo $MSG
 echo
 echo "Select option : ";
 }

la getcharfunción:

getchar (){
        stty raw
    answer=`dd bs=1 count=1 2> /dev/null `
    stty -raw
}   

la función de mala elección:

badchoice () {
 MSG="Invalid menu choice"
}

Después de ejecutar el script, muestra el menú.

<System date>

summit Data Extract utility   (SOPRA v1.1)


1.  Extract summit configuration data only    
 2.  Extract summit config data in flat files only
 3.  Extract summit account data only
 4.  Extract all data 
 5.  Load summit configuration data from Dump
 6.  Load summit config data from flat files only


 x.  Exit

 Select option : 

El usuario ingresa 5, pero no aparece en la pantalla y después de presionar Enter2 o 3 veces, muestra el mensaje:

Invalid menu choice.

No puedo entender dónde está causando el problema. La función del menú se ejecuta bien, causa problemas cuando ingresa getchar()a la función y a la casedeclaración.

Respuesta1

No funcionó para mí tal como está escrito, presumiblemente porque

answer=`dd bs=1 count=1 2> /dev/null `

no ejecuta el comando y lo establece answeren el valor de retorno de ddsino que asigna la cadena ( dd bs=1 count=1) a la variable answer.

Editando para dar la expansión.

answer=$(dd bs=1 count=1 2> /dev/null)

funcionó bien

información relacionada