getopt よりも getopts2011年03月17日 15時10分34秒

getopt(3) は UNIX で、コマンドの引数を処理する一般的な C 言語のライブラリ関数。それを用いて実装された getopt(1) コマンドも存在する。そして、Bourne シェル系だと getopts と言う内部関数もある。

getopt だと外部コマンドになり、色々と厄介なことがあるので、Bourne シェル系だと getopts を使った方が余計事が少なくて良い。

getops は while ループと case 分岐式で使うのが定石。getopts は第一引数に、受け付けるオプションを羅列した文字列を受け取る。もし、オプションが引数を取る場合はコロンを後に付けると、OPTARG 変数に値が保持される。第二引数として、結果が返される。疑問符が返ってきたときは、無効なオプションがわたされたたとき。break で抜けるか、使い方を表示して exit が一般的。そして、最後に処理した引数の数だけ、shift する。


% cat opt.sh 
#/bin/sh

while getopts ab: flag
do
    case $flag in
        a)
            echo a
        ;;
        b)
            echo b $OPTARG
        ;;
        \?) # default case
            break
        ;;
    esac
done
shift `expr $OPTIND - 1`
echo "\$*: $*"

時折、shift の式が、expr では無いものを見るが、それらは ksh など、厳密な Bourne shell 自体では無く、互換型だったりすることが多い。

上記を実行してみる。


% sh opt.sh -a
a
$*: 

-a が消費されている。

% sh opt.sh -b
No arg for -b option
$*: -b
% sh opt.sh -b B
b B
$*: 

-b は引数を渡さないとエラーが表示される。

% sh opt.sh -c
Illegal option -c
$*: -c

-c は不正なオプションで、引数として消費されていない。

% sh opt.sh -a -- -d
a
$*: -d

二重ハイホン (--) を渡すことにより、getopts の処理を止めることが出来る。