正しいシェルスクリプト

正しいシェルスクリプト

以前は動作していたシェルスクリプトがありますが、今はいくつかの異なる結果を提供します。

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)

非常にうまく動作

おすすめ記事