シェルスクリプトを書くときに地味に便利なgetopt

 シェルスクリプトを書くとき、引数のチェック処理は地味にめんどくさいのですが、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/