2011年2月13日日曜日

getoptによるロングオプション解析

ロングオプション(--tmpdir /tmp みたいなやつ)が欲しいと思ったことはなかったのですが、この日書いていたスクリプトに、意味をよく理解して注意して指定して欲しいオプションを実装しようとしていて、そういう局面ではロングオプションを使うのがいいのでは?と思い至りました。
そこで、まずは練習として、前に書いたテンプレート(getoptを使う版)を拡張して、ロングオプションに対応してみました。
#!/bin/bash
#
# getopt-long-template.bash (use getopt utility)
#
export LANG=C
usage_exit() {
        echo "Usage: getopt-long-template.bash [-a] [-d dir] [--extra] [--file f] item1 item2 ..." 1>&2
        exit 1
}
#
# Options
#
echo "$@"       ####DEBUG
GETOPT=`getopt -q -o ad:h -l extra,file: -- "$@"` ; [ $? != 0 ] && usage_exit
eval set -- "$GETOPT"
echo "$@"       ####DEBUG
while true
do
  case $1 in
  -a)   A_FLAG=yes      ; shift
        ;;
  -d)   OUTDIR=$2       ; shift 2
        ;;
  --extra)      EXTRA_F=yes     ; shift
        ;;
  --file)       OUTFILE=$2      ; shift 2
        ;;
  -h)   usage_exit
        ;;
  --)   shift ; break
        ;;
  *)    usage_exit
        ;;
  esac
done
#
echo \$#=$#             ####DEBUG
echo \$@="$@"           ####DEBUG
echo A_FLAG=$A_FLAG     ####DEBUG
echo OUTDIR=$OUTDIR     ####DEBUG
echo EXTRA_F=$EXTRA_F   ####DEBUG
echo OUTFILE=$OUTFILE   ####DEBUG
実行結果は次のとおりです。--extra オプションと --file f オプションを解釈できるようになりました。
# ./getopt-long-template.bash item1 item2 -d dir --extra --file f
item1 item2 -d dir --extra --file f
-d dir --extra --file f -- item1 item2
$#=2
$@=item1 item2
A_FLAG=
OUTDIR=dir
EXTRA_F=yes
OUTFILE=f

下記も参照ください。
オプション解析(getoptsとgetoptの使い分け)

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ