シェルスクリプトを書くとき、引数のチェック処理は地味にめんどくさいのですが、Linux上ではgetoptというコマンドが華麗に処理をしてくれるようです。ちなみにbash内にもgetoptsというビルトイン関数があるのですが、汎用性では若干getoptの方が上かな?といった感じです。
使い方は、
getopt -o shortoptstring -l longoptstring -- parameter
shortoptstringは-aや-bなどパラメータが1文字の引数。-abという風に続けて書いた場合でも処理できます。書式は「abc」のように並べて書くだけ。特殊な記法として「:(コロン)」を使う書き方があります。「:」は1個だとパラメータに引数が必須となるもの。つまり「-a hoge」等パラメータを渡さないとパーサが失敗して、getoptが正常終了しません。また「::」と2つ繋げると、引数をとる場合もあるという意味になります。
longoptstringは--hostname等長いパラメータを渡す引数。ちなみにオプションを変えれば「--」の部分を「-」と1文字に変えたり、「+」にすることも出来ます。shortoptstringと違いパラメータは「,(カンマ)」で区切ります。また、shortoptstringと同様に「:」を使った記法が可能です。
今回は hostnameとusernameを引数として渡すシェルを書いたので、以下のように書きました。
#!/bin/bash # check command args. if [ $# -lt 1 ]; then echo >&2 "usage: $0 [-h|--hostname hostname] [-u|--hostuser username]" exit 1 fi OPT=`getopt -o h:u: -l hostname:,hostuser: -- $*` if [ $? != 0 ]; then echo >&2 "usage: $0 [-h|--hostname hostname] [-u|--hostuser username]" exit 1 fi eval set -- $OPT while [ -n "$1" ]; do case $1 in -h|--hostname) hostname=$2 ; shift 2;; -u|--hostuser) hostuser=$2 ; shift 2;; --) shift; break;; *) echo "Unknown option($1) used."; exit 1;; esac done
getoptのパースが成功するとリターンコードとして0が返ります。返らなければパースが失敗しているので、エラーメッセージを出して終了させます。
成功すると、「--hostname foo --username bar --」のような文字列を出力するので、--が来るまでループをまわして、処理すれば、簡単に変数のチェックとパースを行うことが出来ます。
参考にしたサイト
http://www.linux.or.jp/JM/html/util-linux/man1/getopt.1.html
http://d.hatena.ne.jp/taiyo/20080211/