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