オプションの重複・共存をチェックする関数

関数名 Opt_Cnflct
書式 Opt_Cnflct 入力オプション群 [共存できないオプション群]
目的 オプションの重複・共存をチェックする
戻り値 重複や共存に問題がない場合:0 問題がある場合:1 エラー9:
たとえばtarコマンドだと、cオプションは作成、xオプションは展開で
正反対の意味を持つので同時に利用するとエラーになる

Opt_Cnflct () {
    . Error_Msg.sh && . Arg_Nums.sh || \
    { echo "Opt_Cnflct: erorr: Function not found."; 1>&2; exit 9; }
    Arg_Nums -ge 1 "$@" && Arg_Nums -le 2 "$@" || \
    { Error_Msg Opt_Cnflct "Number of Arguments was wrong."; exit 9; }

    local _COUNT=1
    local _FLAG=0
    local _OPTION=
    local _OPTIONS_SPRT=
    local _OPTIONS_PASS=

    #設定されているオプションが1個以下であれば問題がないと判断
    #${#1}は第一引数の文字数
    [ "${#1}" -le 1 ] && return 0

    #設定されているオプション郡を空白文字で区切る
    while [ "$_COUNT" -le "${#1}" ]; do
        [ "$_OPTIONS_SPRT" != "" ] && _OPTIONS_SPRT="$_OPTIONS_SPRT "
        _OPTIONS_SPRT="$_OPTIONS_SPRT$(echo $1 | cut -c $_COUNT)"
        _COUNT=$(($_COUNT + 1))
    done

    #設定されているオプションの1つ1つについて
    for _OPTION in $_OPTIONS_SPRT; do

        #重複するオプションの存在チェックと判定
        #_OPTIONの値が_OPTIONS_PASSの値の中に含まれているか確認する
        echo "$_OPTIONS_PASS" | grep -q "$_OPTION"
        if [ "$?" -eq 0 ]; then
            return 1
        else
            _OPTIONS_PASS="$OPTIONS_PASS$_OPTION"
        fi

        #共存できないオプションの存在チェックと判定
        #第二引数の共存できないオプション群に_OPTIONが含まれているか
        #複数の入力オプション文字が一致した場合もんだいになるので
        #2回目に見つかった時に戻り値を1をセットし関数を終了する
        echo "$2" | grep -q "$_OPTION"
        if [ "$?" -eq 0 ]; then 
            if [ "$_FLAG" -eq 0 ]; then
                _FLAG=1
            else
                return 1
            fi
        fi

        #引数を付け忘れたオプションのチェック
        echo ":" | grep -q "$_OPTION" && return 1
    done
    return 0
}
#この関数を実際に使う場合
#getoptsコマンドをサイレントモードで使用し、引数に必要な
#オプションに引数を付け忘れると変数OPTに「:」が代入される
#なので_OPTIONSに「:」が含まれる場合はオプション指定が不正
while getopts ":abc" OPT; do
    case $OPT in
        a)  ;;
        b)  ;;
        c)  ;;
        \?) ;;
    esac
    #OPTに代入された全てのオプション文字列を_OPPTIONSに集めている
    _OPTIONS=$_OPTIONS$OPT
done
#_OPTIONSを第一引数にしてOpt_Cnflctを呼び出す
Opt_Cnflct $OPTIONS abc