UNIX/Linuxの部屋 selectコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド select メニュー形式の選択肢を提示し、ユーザに選ばせる。bash の内部コマンド このエントリーをはてなブックマークに追加

最終更新


select コマンドは、端末上にメニュー形式の選択肢を表示してユーザに選ばせることができる bash の内部コマンドである。I/O にデータがあるかを調べるためのシステムコール select(2) とは全く関係ない。SQL の SELECT 文とも関係ない。

select コマンドは sh・csh・tcsh には存在しない。bash のみの内部コマンドである。


select コマンドで何ができるか
select コマンドを使うと、以下のような選択肢を表示することができる。
1) blue
2) red
3) green
4) other
#?
また、下記のようにユーザの入力を受けつけて、それに応じた処理を簡単に組むことができる。もし選択肢以外の入力があった場合、再度入力させることも可能である。
#? 1
your input is blue
#? 3
your input is green

select コマンドの基本的な使い方
select コマンドの文法は以下のとおり。select だけ、というのはできない。do 〜 done までがセットである。
select [変数] in 選択肢1 選択肢2 選択肢3 ...
do
処理内容
done

実践的な例だと下記のような書き方になる。
select var in blue red green other;
do
if [ "$var" == "" ]; then
echo "Your input ($REPLY) is bad."
else
echo "your input is $var ($REPLY)"
if [ "$var" == "blue" ]; then
# 何かしらの処理
:
elif [ "$var" == "red" ]; then
# 何かしらの処理
:
fi
break
fi
done

select の選択肢に空白を入れるには
下記のように空白を含む選択肢をダブルクォートやシングルクォートで囲めばよい。
select var in blue red green "other color"; do
echo $var
done

あるいは IFS をいじる手もある。
choice="blue@red@green@other color"
OLDIFS=$IFS
IFS="@"
select var in $choice; do
IFS=$OLDIFS
echo $var
done

Howto: select に配列を渡す
下記のようにする。
myarray=(blue red green "other color")
select var in "${myarray[@]}"; do
echo $var
done
bash での配列については下記を参照。

select の入力値が格納される $REPLY について
select var とした場合、選ばれた選択肢の値が $var に格納されるが、ユーザが実際に入力した文字列 (1 や 2など) は $REPLY という変数に格納される (この変数名は固定で変えられないようだ)。
1) blue
2) red
となっているとき、期待されている入力は 1 や 2 であり、blue・red ではないが、$REPLY を見ることで、もし blue や red が入力されたとしても受け付けられるようにする、という作り方もできるだろう。

select のプロンプト変更
プロンプトはデフォルトでは
#?
であるが、シェル変数 PS3 を設定することで好きなプロンプトを指定可能である。
PS3="選択肢から選んでください: "
select var in blue red green black other;
とすれば下記のようになる。
1) blue
2) red
3) green
4) other
選択肢から選んでください:

select の選択肢番号
下記のように、select の選択肢番号に好きな値を設定することはできない模様である。
10) blue
20) red
30) green
99) other

select がセットする変数 $REPLY について
ユーザが実際に入力した文字列 (1 や 2など) は $REPLY という変数に格納される。
1) blue
2) red
となっているとき、期待されている入力は 1 や 2 であり、blue・red ではないが、$REPLY を見ることで、もし blue や red が入力されたとしても受け付けられるようにする、作り方もできるだろう。

Howto: ファイルを選択させる
下記のように選択肢にファイルを指定することで、ファイル選択が簡単に行える。
select var in *.txt; do
echo "$var"
done

下記は /etc/* を対象とした例である。選択肢の数が多いと表示が二段組になるようである。
 1) /etc/X11                    56) /etc/nscd.conf
 2) /etc/aliases                57) /etc/nsmb.conf
 3) /etc/amd.map                58) /etc/nsswitch.conf
 4) /etc/apmd.conf              59) /etc/ntp
 5) /etc/auto_master            60) /etc/ntp.conf
 6) /etc/autofs                 61) /etc/ntp.conf.orig
 7) /etc/blacklistd.conf        62) /etc/opieaccess
 (略)

関連コマンド
より大げさなメニューを表示したい場合、dialog コマンドを使うとよい。