オプションの重複・共存をチェックする関数
関数名 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