シェルスクリプトではselectという構文が用意されている。
while文とメニュー表示機能が組み合わさったような機能で、シェルスクリプトらしい機能だ。
このページではサンプルプログラムをご紹介しつつ、selectの使い方をまとめてみた。参考にしていただければと思う。
目次 [hide]
シェルスクリプトのselectとは?
「select」文をつかうと簡易的な対話メニューが簡単に作成できるので便利だ。
丁度while文にメニュー表示機能がまざったような処理をする。メニューを表示しループ処理に入り、変数と分岐処理をつかって制御することが多い。
実際while文と分岐処理を使用し、作り込むと同じようなことができる。しかし若干大がかりになるので素直にselect文を使おう。
これまで解説してきた制御文は「必須の処理」が殆どだったが、今回は「より便利な処理」を実現するため制御文といえる。
なお「select」はbashで追加された制御文でshには対応していない。
selectの書式
次のようになる。
select 変数 in リスト
do
変数に応じた処理
done
Selectのサンプルプログラム
実際にサンプルプログラムと実行結果を見て確認していただくのがわかりやすいだろう。
サンプルプログラム
vi select-ex1.sh
実行結果
$ ./select-ex1.sh
このように、表示をしつつループを回すのがselectだ。
終了するときにとっさに「exit」と入力しそうになるがexitと打ってもループから抜け出せない。番号を入力しよう。
その他の事柄
もう少しいりくんだサンプル
もう少し難しめの例をご紹介しよう。
vi select-ex2.sh
実行結果
$ ./select-ex2.sh
「$REPLY」が突然でてきたがこれはselectを使用するときに内部で生成される特別な変数だ。この中には、あなたの入力した値が代入される。数字の他文字列も表示される。
caseで処理を分岐、および実際にコマンドを起動させて、終了したらプロンプトを再表示するようにしている。
選択時のプロンプトを変更する
プロンプト変数を変更するとプロンプトの表示が変更できる。
プロンプト変数には「PS1、PS2、PS3、PS4」の4つあるが、PS1は通常のプロンプト、PS2はコマンド入力が完了していないときのプロンプト、対話的な継続されるプロンプト表示、telnetなどのプロンプトだ。PS3はselectなどのプロンプト、PS4はbashのデバックのためのプロンプトとなっている。
今回はPS3を変更しプロンプトを変えてみよう。
select-ex3.sh
実行結果
$ ./select-ex3.sh
caseとwhileでメニュー表示と分岐
大体ではあるが以下のようにするとメニュー表示と分岐ができる。bashではなくshしか使えない環境などは無限ループと分岐処理を使用すれば、同じ様な処理が可能だ。
もっとつくりこめば、実際のselectと同じような動作をする実装が可能だが、非常に大がかりになってしまう。
vi select-ex4.sh
実行結果
$ ./select-ex4.sh
まとめ
このページではシェルスクリプトのselectについて、4つのサンプルコードを使ってご紹介した。selectについて一通り理解できただろうか?
selectは知っておくと便利な構文だ。ぜひ実際にサンプルを手元で組んで、実行をしてみていただきたい。