44#
55# @Usage
66# source this script to your script file, then use func parseOpts.
7- # parseOpts func useage sample:
7+ # parseOpts func usage sample:
88# $ parseOpts "a,a-long|b,b-long:|c,c-long+" -a -b bv -c c.sh -p pv -q qv arg1 \; aa bb cc
9- # then below globle var is set:
9+ # then below global var is set:
1010# _OPT_VALUE_a = true
1111# _OPT_VALUE_a_long = true
1212# _OPT_VALUE_b = bv
1919# @author Jerry Lee (oldratlee at gmail dot com)
2020
2121# ####################################################################
22- # Util Funtions
22+ # Util Functions
2323# ####################################################################
2424
2525# NOTE: $'foo' is the escape sequence syntax of bash
2626readonly _opts_ec=$' \033 ' # escape char
2727readonly _opts_eend=$' \033 [0m' # escape end
2828
29+ # shellcheck disable=SC2209
2930_opts_SED_CMD=sed
3031if command -v gsed & > /dev/null; then
3132 _opts_SED_CMD=gsed
@@ -35,7 +36,7 @@ _opts_colorEcho() {
3536 local color=$1
3637 shift
3738 # if stdout is console, turn on color output.
38- [ -t 1 ] && echo " $_opts_ec [1;${color} m$@ $ _opts_eend" || echo " $@ "
39+ [ -t 1 ] && echo " ${ _opts_ec} [1;${color} m$* ${ _opts_eend} " || echo " $* "
3940}
4041
4142_opts_redEcho () {
@@ -44,7 +45,7 @@ _opts_redEcho() {
4445
4546_opts_convertToVarName () {
4647 [ $# -ne 1 ] && {
47- _opts_redEcho " NOT 1 arguemnts when call _opts_convertToVarName: $@ "
48+ _opts_redEcho " NOT 1 arguments when call _opts_convertToVarName: $* "
4849 return 1
4950 }
5051 echo " $1 " | $_opts_SED_CMD ' s/-/_/g'
@@ -53,7 +54,7 @@ _opts_convertToVarName() {
5354# ####################################################################
5455# Parse Functions
5556#
56- # Use Globle Variable:
57+ # Use Globe Variable:
5758# * _OPT_INFO_LIST_INDEX : Option info, data structure.
5859# _OPT_INFO_LIST_INDEX ->* _a_a_long -> option value.
5960# * _OPT_VALUE_* : value of option. is Array type for + mode option
@@ -62,14 +63,14 @@ _opts_convertToVarName() {
6263
6364_opts_findOptMode () {
6465 [ $# -ne 1 ] && {
65- _opts_redEcho " NOT 1 arguemnts when call _opts_findOptMode: $@ "
66+ _opts_redEcho " NOT 1 arguments when call _opts_findOptMode: $* "
6667 return 1
6768 }
6869
6970 local opt=" $1 " # like a, a-long
7071 local idxName
7172 for idxName in " ${_OPT_INFO_LIST_INDEX[@]} " ; do
72- local idxNameArrayPlaceHolder=" $idxName [@]"
73+ local idxNameArrayPlaceHolder=" ${ idxName} [@]"
7374 local -a idxNameArray=(" ${! idxNameArrayPlaceHolder} " )
7475
7576 local mode=" ${idxNameArray[0]} "
@@ -88,7 +89,7 @@ _opts_findOptMode() {
8889
8990_opts_setOptBool () {
9091 [ $# -ne 2 ] && {
91- _opts_redEcho " NOT 2 arguemnts when call _opts_setOptBool: $@ "
92+ _opts_redEcho " NOT 2 arguments when call _opts_setOptBool: $* "
9293 return 1
9394 }
9495
@@ -97,7 +98,7 @@ _opts_setOptBool() {
9798
9899_opts_setOptValue () {
99100 [ $# -ne 2 ] && {
100- _opts_redEcho " NOT 2 arguemnts when call _opts_setOptValue: $@ "
101+ _opts_redEcho " NOT 2 arguments when call _opts_setOptValue: $* "
101102 return 1
102103 }
103104
@@ -106,15 +107,17 @@ _opts_setOptValue() {
106107
107108 local idxName
108109 for idxName in " ${_OPT_INFO_LIST_INDEX[@]} " ; do
109- local idxNameArrayPlaceHolder=" $idxName [@]"
110+ local idxNameArrayPlaceHolder=" ${ idxName} [@]"
110111 local -a idxNameArray=(" ${! idxNameArrayPlaceHolder} " )
111112
112113 local optName
113114 for optName in " ${idxNameArray[@]: 1: ${# idxNameArray[@]} } " ; do # index from 1, skip mode
114115 [ " $opt " == " $optName " ] && {
115116 local optName2
116117 for optName2 in " ${idxNameArray[@]: 1: ${# idxNameArray[@]} } " ; do
117- local optValueVarName=" _OPT_VALUE_$( _opts_convertToVarName " ${optName2} " ) "
118+ local optValueVarName
119+ optValueVarName=" _OPT_VALUE_$( _opts_convertToVarName " ${optName2} " ) "
120+ # shellcheck disable=SC2016
118121 local from=' "$value"'
119122 eval " $optValueVarName =$from " # set global var!
120123 done
@@ -133,7 +136,7 @@ _opts_setOptArray() {
133136
134137 local idxName
135138 for idxName in " ${_OPT_INFO_LIST_INDEX[@]} " ; do
136- local idxNameArrayPlaceHolder=" $idxName [@]"
139+ local idxNameArrayPlaceHolder=" ${ idxName} [@]"
137140 local -a idxNameArray=(" ${! idxNameArrayPlaceHolder} " )
138141
139142 local optName
@@ -142,7 +145,8 @@ _opts_setOptArray() {
142145 # set _OPT_VALUE
143146 local optName2
144147 for optName2 in " ${idxNameArray[@]: 1: ${# idxNameArray[@]} } " ; do
145- local optValueVarName=" _OPT_VALUE_$( _opts_convertToVarName " ${optName2} " ) "
148+ local optValueVarName
149+ optValueVarName=" _OPT_VALUE_$( _opts_convertToVarName " ${optName2} " ) "
146150 local from=' "$@"'
147151 eval " $optValueVarName =($from )" # set global var!
148152 done
@@ -158,14 +162,15 @@ _opts_setOptArray() {
158162_opts_cleanOptValueInfoList () {
159163 local idxName
160164 for idxName in " ${_OPT_INFO_LIST_INDEX[@]} " ; do
161- local idxNameArrayPlaceHolder=" $idxName [@]"
165+ local idxNameArrayPlaceHolder=" ${ idxName} [@]"
162166 local -a idxNameArray=(" ${! idxNameArrayPlaceHolder} " )
163167
164168 eval " unset $idxName "
165169
166170 local optName
167171 for optName in " ${idxNameArray[@]: 1: ${# idxNameArray[@]} } " ; do # index from 1, skip mode
168- local optValueVarName=" _OPT_VALUE_$( _opts_convertToVarName " $optName " ) "
172+ local optValueVarName
173+ optValueVarName=" _OPT_VALUE_$( _opts_convertToVarName " $optName " ) "
169174 eval " unset $optValueVarName "
170175 done
171176 done
@@ -180,56 +185,62 @@ parseOpts() {
180185
181186 _OPT_INFO_LIST_INDEX=() # set global var!
182187
183- local optDescLines=$( echo " $optsDescription " |
184- # cut head and tail space
185- $_opts_SED_CMD -r ' s/^\s+//;s/\s+$//' |
186- awk -F ' [\t ]*\\|[\t ]*' ' {for(i=1; i<=NF; i++) print $i}' )
188+ local optDescLines
189+ optDescLines=$(
190+ echo " $optsDescription " |
191+ $_opts_SED_CMD -r ' s/^\s+//;s/\s+$//' | # cut head and tail space
192+ awk -F ' [\t ]*\\|[\t ]*' ' {for(i=1; i<=NF; i++) print $i}'
193+ )
187194
188195 local optDesc
189- while read optDesc; do # optDesc LIKE b,b-long:
196+ while read -r optDesc; do # optDesc LIKE b,b-long:
190197 [ -z " $optDesc " ] && continue
191198
192- local mode=" ${optDesc: (-1)} " # LIKE : or +
199+ # LIKE : or +
200+ local mode=" ${optDesc: (-1)} "
193201 case " $mode " in
194202 + | : | -)
195- optDesc=" ${optDesc: 0: (${# optDesc} - 1)} " # LIKE b,b-long
203+ # LIKE b,b-long
204+ optDesc=" ${optDesc: 0: (${# optDesc} - 1)} "
196205 ;;
197206 * )
198207 mode=" -"
199208 ;;
200209 esac
201210
202- local optLines=$( echo " $optDesc " | awk -F ' [\t ]*,[\t ]*' ' {for(i=1; i<=NF; i++) print $i}' ) # LIKE "a\na-long"
211+ # LIKE "a\na-long"
212+ local optLines
213+ optLines=" $( echo " $optDesc " | awk -F ' [\t ]*,[\t ]*' ' {for(i=1; i<=NF; i++) print $i}' ) "
203214
204- [ $( echo " $optLines " | wc -l) -gt 2 ] && {
215+ [ " $( echo " $optLines " | wc -l) " -gt 2 ] && {
205216 _opts_redEcho " Illegal option description($optDesc ), more than 2 opt name!" 1>&2
206217 _opts_cleanOptValueInfoList
207218 return 220
208219 }
209220
210221 local -a optTuple=()
211222 local opt
212- while read opt; do # opt LIKE a , a-long
223+ while read -r opt; do # opt LIKE a , a-long
213224 [ -z " $opt " ] && continue
214225
215- [ ${# opt} -eq 1 ] && {
226+ if [ ${# opt} -eq 1 ]; then
216227 echo " $opt " | grep -E ' ^[a-zA-Z0-9]$' -q || {
217228 _opts_redEcho " Illegal short option name($opt in $optDesc ) in option description!" 1>&2
218229 _opts_cleanOptValueInfoList
219230 return 221
220231 }
221- } || {
232+ else
222233 echo " $opt " | grep -E ' ^[-a-zA-Z0-9]+$' -q || {
223234 _opts_redEcho " Illegal long option name($opt in $optDesc ) in option description!" 1>&2
224235 _opts_cleanOptValueInfoList
225236 return 222
226237 }
227- }
238+ fi
228239 optTuple=(" ${optTuple[@]} " " $opt " )
229240 done < <( echo " $optLines " )
230241
231242 [ ${# optTuple[@]} -gt 2 ] && {
232- _opts_redEcho " more than 2 opt(${optTuple[@ ]} ) in option description($optDesc )!" 1>&2
243+ _opts_redEcho " more than 2 opt(${optTuple[* ]} ) in option description($optDesc )!" 1>&2
233244 _opts_cleanOptValueInfoList
234245 return 223
235246 }
@@ -263,8 +274,10 @@ parseOpts() {
263274 ;;
264275 -* ) # short & long option(-a, -a-long), use same read-in logic.
265276 local opt=" $1 "
266- local optName=$( echo " $1 " | $_opts_SED_CMD -r ' s/^--?//' )
267- local mode=$( _opts_findOptMode " $optName " )
277+ local optName
278+ optName=$( echo " $1 " | $_opts_SED_CMD -r ' s/^--?//' )
279+ local mode
280+ mode=$( _opts_findOptMode " $optName " )
268281 case " $mode " in
269282 -)
270283 _opts_setOptBool " $optName " " true"
@@ -292,7 +305,7 @@ parseOpts() {
292305 } || valueArray=(" ${valueArray[@]} " " $value " )
293306 done
294307 [ " $foundComma " ] || {
295- _opts_redEcho " value of option $opt no end comma, value = ${valueArray[@ ]} " 1>&2
308+ _opts_redEcho " value of option $opt no end comma, value = ${valueArray[* ]} " 1>&2
296309 _opts_cleanOptValueInfoList
297310 return 231
298311 }
@@ -324,7 +337,7 @@ _opts_showOptDescInfoList() {
324337 echo " show option desc info list:"
325338 local idxName
326339 for idxName in " ${_OPT_INFO_LIST_INDEX[@]} " ; do
327- local idxNameArrayPlaceHolder=" $idxName [@]"
340+ local idxNameArrayPlaceHolder=" ${ idxName} [@]"
328341 echo " $idxName = (${! idxNameArrayPlaceHolder} )"
329342 done
330343 echo " ==============================================================================="
@@ -335,14 +348,15 @@ _opts_showOptValueInfoList() {
335348 echo " show option value info list:"
336349 local idxName
337350 for idxName in " ${_OPT_INFO_LIST_INDEX[@]} " ; do
338- local idxNameArrayPlaceHolder=" $idxName [@]"
351+ local idxNameArrayPlaceHolder=" ${ idxName} [@]"
339352 local -a idxNameArray=(" ${! idxNameArrayPlaceHolder} " )
340353
341354 local mode=${idxNameArray[0]}
342355
343356 local optName
344357 for optName in " ${idxNameArray[@]: 1: ${# idxNameArray[@]} } " ; do # index from 1, skip mode
345- local optValueVarName=" _OPT_VALUE_$( _opts_convertToVarName " $optName " ) "
358+ local optValueVarName
359+ optValueVarName=" _OPT_VALUE_$( _opts_convertToVarName " $optName " ) "
346360 case " $mode " in
347361 -)
348362 echo " $optValueVarName =${! optValueVarName} "
@@ -351,12 +365,12 @@ _opts_showOptValueInfoList() {
351365 echo " $optValueVarName =${! optValueVarName} "
352366 ;;
353367 +)
354- local optArrayValueArrayPlaceHolder=" $optValueVarName [@]"
368+ local optArrayValueArrayPlaceHolder=" ${ optValueVarName} [@]"
355369 echo " $optValueVarName =(${! optArrayValueArrayPlaceHolder} )"
356370 ;;
357371 esac
358372 done
359373 done
360- echo " _OPT_ARGS=(${_OPT_ARGS[@ ]} )"
374+ echo " _OPT_ARGS=(${_OPT_ARGS[* ]} )"
361375 echo " ==============================================================================="
362376}
0 commit comments