selectコマンドは組み込みコマンドで、ユーザに選択を問うような条件分岐に利用できます。選択肢は数字を入力することで選択することができ、selectコマンドはその選択肢を変数に代入してコマンドを実行していきます。
また、選択から抜けるためには組み込みコマンドであるbreakコマンドを利用します。
目次
selectの構文
selectの構文
1 |
select name [in words …]; do commands; done |
name:変数
words:選択肢
commands:実行していくコマンド
selectの利用例
単語から選択
selectコマンドはforコマンドと似たような構文で記述します。selectコマンドを用いれば、ユーザに選択肢を番号で問い、選ばれた選択肢の値を変数に代入して処理を実行することができます。
selectコマンドの処理は、ユーザからEOFが入力されるか、breakコマンドが実行されるまで終了せずに、何度もユーザに入力を問い続けて処理を行っていきます。
また、選択肢以外の番号を選択した場合は変数にnullがセットされます。
test.sh
1 2 3 4 5 6 7 |
#/bin/bash select word in 'aaa' 'bbb' 'ccc' do echo "<--$word-->" break done |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$./test.sh 1) aaa 2) bbb 3) ccc #? 1 <--aaa--> $ $./test.sh 1) aaa 2) bbb 3) ccc #? 2 <--bbb--> |
終了する場合は、Ctrl+C等でプログラムを終了するといいでしょう。また、selectコマンドはEOFが読み込まれると処理が終了するので、Ctrl+DでEOFを送って終了することもできます。
また、下のコマンド例ではCtrl+Dでselectコマンドの処理を抜けています。
test-nobreak.sh
1 2 3 4 5 6 |
#/bin/bash select word in 'aaa' 'bbb' 'ccc' do echo "<--$word-->" done |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 |
$./test-nobreak.sh 1) aaa 2) bbb 3) ccc #? 1 <--aaa--> #? 2 <--bbb--> #? 3 <--ccc--> #? $ |
カレントディレクトリのファイルから選択
*や?,[]のような文字を用いれば、パターンマッチでファイル名を展開できます。このようなパターンマッチを用いれば、selectコマンドでファイルを列挙しなくてもファイルを選択肢に含めることができます。
例ではカレントディレクトリの全てのファイルを展開します。
test2.sh
1 2 3 4 5 6 7 |
#/bin/bash select fname in * do echo "<--$fname-->" break done |
コマンド例と実行結果
1 2 3 4 5 6 7 |
$./test2.sh 1) file1 5) file5 9) file9 2) file2 6) file6 10) test-nobreak.sh 3) file3 7) file7 11) test.sh 4) file4 8) file8 12) test2.sh #? 1 <--file1--> |
引数から選択
selectコマンドのinの句を省力すると、$1,$2,$3のような位置パラメータをすべてリストします。これは、$@をin句に記述したような働きを意味します。
つまり、コマンドの記述で表現するならば、
1 |
select name; do commands; done |
は
1 |
select name in $@; do commands; done |
と等価な処理になります。
test3.sh
1 2 3 4 5 6 7 8 9 10 11 |
#/bin/bash func_select(){ select arguments do echo "<--$arguments-->" break done } func_select 'arg1' 'arg2' 'arg3' |
コマンド例と実行結果
1 2 3 4 5 6 |
$./test3.sh 1) arg1 2) arg2 3) arg3 #? 1 <--arg1--> |
選択を入力するプロンプトの文字列を変更
selectコマンドの入力するプロンプトの文字列を変更するには変数PS3を用いれば、変更することができます。
test4.sh
1 2 3 4 5 6 7 8 9 |
#/bin/bash PS3='>>' select word in 'aaa' 'bbb' 'ccc' do echo "<--$word-->" break done |
コマンド例と実行結果
1 2 3 4 5 6 |
$./test4.sh 1) aaa 2) bbb 3) ccc >>1 <--aaa--> |
入力した行の取得
selectコマンドでユーザが入力した行は、変数REPLYに保存されます。その変数を用いれば、ユーザが入力した行を利用することができます。
test5.sh
1 2 3 4 5 6 7 |
#/bin/bash select word in 'aaa' 'bbb' 'ccc' do echo "<--$REPLY--$word-->" break done |
コマンド例と実行結果
1 2 3 4 5 6 |
$./test5.sh 1) aaa 2) bbb 3) ccc #? 1 <--1--aaa--> |