select
selectを使用すると,メニューを表示してユーザに選択を促すようなスクリプトの記述が容易になるようなので,ためしてみた.
selectは以下の構文をとる.
select SELECTED_VALUE in リスト do 実行文 done実行すると,標準エラー出力にリストの値が番号つきで1行づつ表示され,入力待ちとなる. 番号を選択すると,SELECTED_VALUEにユーザ入力に該当するリストの値が格納され,do-done間の実行文が実行される. 具体例.
> select SELECTED_VALUE in A B C; \ > do \ > echo $SELECTED_VALUE \ > done \ 1) A 2) B 3) C #? 1 A #? 2 B #? 3 C #? 4 #?リストにA,B,Cを指定すると,メニューとして以下が表示される.
1) A 2) B 3) Cそしてプロンプトが表示される.
#?メニューん値を入力すると,入力値に該当するリスト要素がSELECTED_VALUEに格納される. 上の例ではそれをechoにて表示している.
#? 1 A #? 2 B #? 3 C #? 4メニューに無いものが入力されるとSELECTED_VALUEは空となる. ループを抜けるには,プロンプトでEOFを入力するか,実行文でreturnかbreakを実行するようにする.
環境変数PS3を通して,プロンプト文字列を設定できる.
また,ユーザが入力した値そのものは,変数REPLYに設定される.
さらに入力値チェックも加えた具体例
> TARGETS=(
> 'date'
> 'uptime'
> );
> PS3='選択してください > '
> select TARGET in ${TARGETS[*]}
> do
> let SELECTED_INDEX=${REPLY}-1
> if [ "${TARGETS[${SELECTED_INDEX}]}" = "" ]
> then
> echo '終了します.';
> break;
> fi
> eval ${TARGET}
> done
1) date
2) uptime
選択してください > 1
2006年 1月 17日 火曜日 00:54:21 JST
選択してください > 2
00:54:22 up 1:12, 6 users, load average: 0.36, 0.13, 0.04
選択してください > 3
終了します.

