シェルスクリプトの修正

シェルスクリプトの修正

以前は動作していたシェル スクリプトのセクションがありますが、現在は異なる結果が出ています。

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

メニュー機能:

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 : ";
 }

関数getchar

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

悪い選択関数:

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

スクリプトを実行するとメニューが表示されます

<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 : 

ユーザーが 5 を入力しましたが、画面には表示されず、Enter2 ~ 3 回押すと次のメッセージが表示されます。

Invalid menu choice.

どこで問題が発生しているのかわかりません。メニュー関数は正常に実行されますが、getchar()関数とcaseステートメントに入ると問題が発生します。

答え1

おそらく、記載されている通りには機能しなかったため、

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

コマンドを実行して のanswer戻り値を設定するのではddなく、文字列 ( dd bs=1 count=1) を変数 に割り当てますanswer

拡張性を持たせるための編集

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

うまくいきました

関連情報