bash と getopt の連携.

このページの内容は古すぎるので,新しい記事を用意しました
http://d.hatena.ne.jp/pyopyopyo/20180426/p1



複雑な shell script を書くためには,コマンドライン引数の構文解析が必要不可欠.そこで,bash上でgetoptを使ってコマンドライン引数を解析する方法について調べてみた.

getopt の仕様はヤヤコシイ.まずは実際に動かしてみる.

$ getopt  ab  "-ab hoge"
-a  -b -- fuga

このように,getopt は二つの引数をとる.一つ目の引数はオプション文字からなる文字列.上記の例では"ab"であり,オプションとして"-a"と"-b"を受け付けることを示す. 二つ目の引数は解析するコマンドライン引数の文字列である.

getopt の動作としては,まずコマンドライン引数を

  • "-"から始まるオプション文字
  • それ以外の要素

の二つの部分に分割し,次に分割した結果を並び替えて"オプション要素 -- それ以外の要素" の形で出力する.

またオプション文字の後ろにコロン: が付いている場合は,オプションに引数が必要であることを示す.たとえば "-b" オプションが引数を取る場合は,以下のようになる.

$ getopt  ab:  "-ab hoge"
-a  -b fuga --

以上をふまえると, getopt の使い方は,だいたい以下のようになる.

#!/bin/bash

function usage()
{
    echo "usage:"
    echo "$0 [opt]  [argument]"
    echo "   -a"
    echo "   -b=VALUE" 
    echo "   -c"
    exit -1
}

OPT=`getopt "hab:c" $@` || usage 
set -- $OPT

while [ -- != "$1" ]; do
    case $1 in
	-h)
	    usage 
	    ;;
	-a)
	    a=1
	    ;;
	-b)
	    b=$2; shift
	    ;;
	-c)
	    c=1
	    ;;
    esac
    shift 
done

## "--" を取り除く
shift

## オプションの値を表示
echo "a:=$a  b:=$b  c:=$c"

## 残りのコマンドライン引数を表示
while [ -n "$1" ]; do
    echo $1
    shift
done
$ ./fuga.sh  aaa -a  bbb
a:=1  b:=  c:=
aaa
bbb

解ってしまえば簡単.