sistema_progs

Programas para customizar o meu entorno de traballo nos meus equipos persoais
Log | Files | Refs

getopt.sh (3738B)


      1 # bash source -*- mode:sh; mode:sh-bash -*-
      2 
      3 ## 典型的な使用例
      4 ##
      5 ## function myfunc {
      6 ##   local flagVersion= flagHelp= flagEnd=
      7 ##
      8 ##   builtin eval -- "$_ble_getopt_prologue"
      9 ##   ble/getopt.init myfunc "$@"
     10 ##   while ble/getopt.next; do
     11 ##     case $option in
     12 ##
     13 ##     #
     14 ##     # --version, --help (引数を取らないオプション)
     15 ##     #
     16 ##     (-v|--version) flagVersion=1 flagEnd=1 ;;
     17 ##     (-h|--help)    flagHelp=1    flagEnd=1 ;;
     18 ##
     19 ##     #
     20 ##     # -w OPTARG, --width=OPTARG, --width OPTARG の形式で引数を取る場合
     21 ##     #
     22 ##     (-w|--width)
     23 ##       if ble/getopt.get-optarg; then
     24 ##         # 引数が見付かった場合
     25 ##         process "$optarg"
     26 ##       else
     27 ##         # 引数が見付からなかった場合
     28 ##         ble/getopt.print-argument-message "missing an option argument for $option"
     29 ##         getopt_error=1
     30 ##       fi
     31 ##
     32 ##     #
     33 ##     # -c, --continue の形式では引数を取らず、
     34 ##     # --continue=OPTARG の形式では引数を取る場合
     35 ##     #
     36 ##     (-c|--continue)
     37 ##       if ble/getopt.has-optarg; then
     38 ##         # 形式 --continue=... (直接引数あり) の場合
     39 ##         ble/getopt.get-optarg
     40 ##         process "$optarg"
     41 ##       else
     42 ##         # 形式 --continue (直接引数なし) の場合
     43 ##       fi
     44 ##
     45 ##     #
     46 ##     # -- 以降は通常引数として解釈する場合
     47 ##     #
     48 ##     (--)
     49 ##       # 残りの引数を処理
     50 ##       process "${@:optind}"
     51 ##       break ;;
     52 ##
     53 ##     (-*)
     54 ##       ble/getopt.print-argument-message "unknown option."
     55 ##       getopt_error=1 ;;
     56 ##     (*)
     57 ##       process "$option" ;;
     58 ##     esac
     59 ##   done
     60 ##
     61 ##   [[ $flagVersion ]] && print-version
     62 ##   [[ $flagHelp ]] && print-help
     63 ##   [[ $flagEnd ]] && return 0
     64 ##
     65 ##   if ! ble/getopt.finalize; then
     66 ##     # 引数の読み取り中にエラーがあった場合
     67 ##     print-usage >&2
     68 ##     exit 1
     69 ##   elif ! check-argument-consistency; then
     70 ##     ble/getopt.print-message "no input files are specified."
     71 ##     print-usage >&2
     72 ##     exit 1
     73 ##   fi
     74 ## }
     75 
     76 _ble_getopt_locals=(getopt_args getopt_chars getopt_arg getopt_error optind option optarg)
     77 _ble_getopt_prologue='declare "${_ble_getopt_locals[@]}"'
     78 function ble/getopt.init {
     79   getopt_args=("$@")
     80   getopt_chars=
     81   getopt_arg=
     82   getopt_error=
     83   optind=1 option= optarg=
     84 }
     85 function ble/getopt.print-argument-message {
     86   local IFS=$_ble_term_IFS
     87   local index=$((optind-1))
     88   ble/util/print "${getopt_args[0]##*/} (argument#$index \`${getopt_args[index]}'): $*" >&2
     89 }
     90 function ble/getopt.print-message {
     91   local IFS=$_ble_term_IFS
     92   local index=$((optind-1))
     93   ble/util/print "${getopt_args[0]##*/} (arguments): $*" >&2
     94 }
     95 
     96 function ble/getopt.next {
     97   ble/getopt/.check-optarg-cleared
     98   if ((${#getopt_chars})); then
     99     option=-${getopt_chars::1}
    100     getopt_chars=${getopt_chars:1}
    101   elif ((optind<${#getopt_args[@]})); then
    102     option=${getopt_args[optind++]}
    103     if [[ $option == -[^-]* ]]; then
    104       getopt_chars=${option:2}
    105       option=${option::2}
    106     elif [[ $option == --*=* ]]; then
    107       getopt_arg==${option#--*=}
    108       option=${option%%=*}
    109     fi
    110   else
    111     return 1
    112   fi
    113 }
    114 
    115 # optarg
    116 function ble/getopt.get-optarg {
    117   if [[ $getopt_arg ]]; then
    118     optarg=${getopt_arg:1}
    119     getopt_arg=
    120   elif ((optind<${#getopt_args[@]})); then
    121     optarg=${getopt_args[optind++]}
    122   else
    123     return 1
    124   fi
    125 }
    126 function ble/getopt.has-optarg {
    127   [[ $getopt_arg ]]
    128 }
    129 function ble/getopt/.check-optarg-cleared {
    130   if [[ $getopt_arg ]]; then
    131     ble/getopt.print-argument-message "the option argument \`${getopt_arg:1}' is not processed ">&2
    132     getopt_error=1 getopt_arg=
    133   fi
    134 }
    135 
    136 function ble/getopt.finalize {
    137   ble/getopt/.check-optarg-cleared
    138   
    139   [[ ! $getopt_error ]]
    140 }
    141