getopt よりも getopts ― 2011年03月17日 15時10分34秒
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 の処理を止めることが出来る。
最近のコメント