bashのビルドインでselectコマンドがあります。
このselectを利用すると簡単に選択メニューを実現することができます。
以下、selectを利用したサンプルシェルスクリプトおよび実行結果を記します。
尚、利用したディストリビューションはUbuntuです。
シェルがbashであれば他のディストリビューションでも同様に動作するはずです。
以下のselectを用いたサンプルスクリプトを説明します。
1 #!/bin/bash 2 3 echo What linux distribution do you use? 4 ans1="Debian" 5 ans2="Ubuntu" 6 ans3="LinuxMint" 7 ans4="CentOS" 8 ans5="fedora" 9 10 select ANS in "$ans1" "$ans2" "$ans3" "$ans4" "$ans5" 11 do 12 if [ -z "$ANS" ]; then 13 continue 14 else 15 break 16 fi 17 done 18 19 echo You selected $REPLY\) $ANS
sakura@ubuntu:~$ ./select-1.sh What linux distribution do you use? 1) Debian 2) Ubuntu 3) LinuxMint 4) CentOS 5) fedora #? 2 You selected 2) Ubuntu
範囲外の値を入力した場合
$ ./select-1.sh What linux distribution do you use? 1) Debian 2) Ubuntu 3) LinuxMint 4) CentOS 5) fedora #? 100 #?
上記の実行結果より、$REPLYには入力した文字(数字)が格納され、$ANSには数字に対応した文字列が格納されることがわかります。
また、範囲外の値を入力した場合(上記では100を入力)は、再度#?プロンプトが表示されるのがわかります。
selectではPS3変数にプロンプトメッセージを設定することにより#?を変更することができます。
以下にselect-01.shを一部変更したサンプルシェルスクリプトを記します。
1 #!/bin/bash 2 3 PS3="What linux distribution do you use? >" 4 ans1="Debian" 5 ans2="Ubuntu" 6 ans3="LinuxMint" 7 ans4="CentOS" 8 ans5="fedora" 9 10 select ANS in "$ans1" "$ans2" "$ans3" "$ans4" "$ans5" 11 do 12 if [ -z "$ANS" ]; then 13 continue 14 else 15 break 16 fi 17 done 18 19 echo You selected $REPLY\) $ANS
変更行は3行目だけです。
echoで表示していたメッセージをPS3に設定するように変更しました。
以下、範囲外を指定し、その後3) LinuxMintを選択したときの実行結果です。
$ ./select-2.sh 1) Debian 2) Ubuntu 3) LinuxMint 4) CentOS 5) fedora What linux distribution do you use? >100 What linux distribution do you use? >3 You selected 3) LinuxMint
PS3にメッセージを設定することにより選択一覧表示後、入力プロンプトが指定したメッセージになります。