Skip to content

Commit aeb58b1

Browse files
committed
refactor: fix parseOpts.sh warning from shellcheck; fix typos
1 parent 9eede16 commit aeb58b1

File tree

1 file changed

+52
-38
lines changed

1 file changed

+52
-38
lines changed

lib/parseOpts.sh

Lines changed: 52 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
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
@@ -19,13 +19,14 @@
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
2626
readonly _opts_ec=$'\033' # escape char
2727
readonly _opts_eend=$'\033[0m' # escape end
2828

29+
# shellcheck disable=SC2209
2930
_opts_SED_CMD=sed
3031
if 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

Comments
 (0)