ファイヤープロジェクト
select
2006-01-17T01:00+09:00   matsu
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
終了します.
matsu(C)
Since 2002
Mail to matsu