【 getopts 】コマンド――bashのシェルスクリプト内でオプションを解析する:Linux基本コマンドTips(378)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、bashのシェルスクリプト内でオプションを解析する「getopts」コマンドです。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、bashのシェルスクリプト内でオプションを解析する「getopts」コマンドです。
getoptsコマンドとは?
「getopts」は、bashのシェルスクリプト内でオプションを解析する際に役立つコマンドです。自作のシェルスクリプトで「-a」のような「ハイフン+アルファベット1文字」のオプションを扱う際に便利です。「-f ファイル名」のように引数を取るオプションも解析できます。
getoptsコマンドはbashのビルトインコマンド(内部コマンド、シェルコマンド)です。このため、「man」コマンドではなく、「help」コマンドや「man bash」で詳細を確認します。
シェルスクリプトのオプションを解析する他の方法もあります。まず、getoptsとよく似た名前で用途も同じ「getopt」コマンド(/usr/bin/getopt)があります。getoptコマンドはgetoptsとは異なり、「--」から始まるロングオプションも扱うことができます(連載第379回)。
この他、引数を1つずらす「shift」コマンドを使ってオプションを解析することも可能です。
コマンドの書式
getopts オプション文字列 変数名
※ [ ]は省略可能な引数を示しています。
getoptsの主なオプション
getoptsにはオプションはありません。なお、オプション文字列の先頭に「:」記号を入れるかどうかによって、エラーメッセージ表示の有無を変更できます(本文を参照)。
オプションを解析する
getoptsでオプションを処理する際には、一般に「while文」と「case文」を組み合わせて使用します(※1)。
※1 opt1.shにあるwhile文については「シェルスクリプトに挑戦しよう(14)」を参照。case文については「シェルスクリプトに挑戦しよう(9)」を参照。
ここではスクリプト1を使って、getoptsの動作を見てみましょう。スクリプト1(opt1.sh)は、オプション「-a」「-b」「-c」を使用し、それぞれのオプションに応じてメッセージを表示します。
#! /bin/bash while getopts abc OPT do case $OPT in a) echo "[-a] が指定された";; b) echo "[-b] が指定された";; c) echo "[-c] が指定された";; *) echo "該当なし(OPT=$OPT)";; esac done
opt1.shの2行目にある「getopts abc OPT」の「abc」の部分は、利用するオプションの種類を指定しています。ここでは「-a」「-b」「-c」の3つです。続く「OPT」はgetoptsが解析した結果をセットする変数の名前で、case文で参照($OPT)しています。
画面1ではopt1.shの動作を確認しています。オプションを指定する際、「-a -b」のように個別に指定できる他、「-bc」のようにまとめて指定できることが分かります。さらに、getoptsで指定していないオプションが与えられた場合は、変数OPTに「?」という文字がセットされる様子も分かります。
エラーメッセージを表示しない
getoptsに指定していないオプションを使用すると、画面1のように「不正なオプションです -- d」、あるいは「illegal option -- d」のようなメッセージを表示します。
このようなgetoptsのエラーメッセージを表示したくない場合は、「getopts :abc OPT」のように、オプション文字列の先頭に「:」記号を入れます。
スクリプト2(opt2.sh)では、先ほどのopt1.shの一部を書き換えて、独自のエラーメッセージを表示するようにしました。「OPTARG」という組み込み変数にはgetoptsが現在解析しようとしている文字列が入っています(※2)。abc以外のオプションを指定したとき、変数OPTには、解析結果である「?」という文字が入ります。
※2 getoptsコマンドでは、この他、2つの組み込み変数を利用できる。「OPTERR」はエラー出力を制御する変数で、初期値は1。値を0にすると「:」を付けたときと同様にエラー出力を抑制する。「OPTIND」は現在処理している引数の位置を表す。
#! /bin/bash while getopts :abc OPT do case $OPT in a) echo "[-a] が指定された";; b) echo "[-b] が指定された";; c) echo "[-c] が指定された";; *) echo "$OPTARGは定義されていません(OPT=$OPT)";; esac done
引数付きのオプションを使用する
Copyright © ITmedia, Inc. All Rights Reserved.