@renault-digital/bash-base 2.1.0 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/bin/bash-base +115 -57
- package/docs/git.io.md +1 -0
- package/docs/references.md +34 -4
- package/man/bash-base.1 +47 -4
- package/package-lock.json +4 -4
- package/package.json +1 -1
- package/spec/argument.spec.sh +64 -6
- package/spec/integ_test.spec.sh +78 -0
- package/spec/reflection.spec.sh +1 -1
- package/src/argument.sh +115 -57
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,31 @@
|
|
|
1
|
+
## [2.3.2](https://github.com/renault-digital/bash-base/compare/v2.3.1...v2.3.2) (2021-12-23)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* shellcheck lint ([d708b3b](https://github.com/renault-digital/bash-base/commit/d708b3b42be1fad5bc5296a74efac742007151d9))
|
|
7
|
+
|
|
8
|
+
## [2.3.1](https://github.com/renault-digital/bash-base/compare/v2.3.0...v2.3.1) (2021-06-14)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* get the inputted value for optional params ([62ba109](https://github.com/renault-digital/bash-base/commit/62ba1097aef765e1616f4489c97207c85007f172))
|
|
14
|
+
|
|
15
|
+
# [2.3.0](https://github.com/renault-digital/bash-base/compare/v2.2.0...v2.3.0) (2021-06-14)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Features
|
|
19
|
+
|
|
20
|
+
* parse args_valid_or_default for the optional params ([c723203](https://github.com/renault-digital/bash-base/commit/c7232032ba96d918b48a76e94bf1477e4c810b35))
|
|
21
|
+
|
|
22
|
+
# [2.2.0](https://github.com/renault-digital/bash-base/compare/v2.1.0...v2.2.0) (2021-06-13)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Features
|
|
26
|
+
|
|
27
|
+
* add args_valid_or_default for the optional params ([db5b8c2](https://github.com/renault-digital/bash-base/commit/db5b8c2099b501ce1eac04580c524d9cb1dc9bb2))
|
|
28
|
+
|
|
1
29
|
# [2.1.0](https://github.com/renault-digital/bash-base/compare/v2.0.2...v2.1.0) (2021-06-13)
|
|
2
30
|
|
|
3
31
|
|
package/bin/bash-base
CHANGED
|
@@ -47,71 +47,90 @@ function args_parse() {
|
|
|
47
47
|
nbPositionalArgValues=$((nbArgValues - OPTIND + 1))
|
|
48
48
|
positionalArgValues=("${@:1:nbPositionalArgValues}")
|
|
49
49
|
positionalVarNames=("${@:nbPositionalArgValues+1:nbPositionalVarNames}")
|
|
50
|
-
if ((nbPositionalVarNames > 0)); then
|
|
51
|
-
for i in $(seq 0 $((nbPositionalVarNames - 1))); do
|
|
52
|
-
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
53
|
-
done
|
|
54
|
-
fi
|
|
55
50
|
|
|
56
|
-
|
|
51
|
+
onlyPositionalVarNames=()
|
|
52
|
+
descriptions=''
|
|
57
53
|
if ((nbPositionalVarNames > 0)); then
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
54
|
+
for i in $(seq 0 $((nbPositionalVarNames - 1))); do
|
|
55
|
+
element=${positionalVarNames[i]}
|
|
56
|
+
|
|
57
|
+
validCommand="$(
|
|
58
|
+
grep -E "^\s*args_valid.*\s+${element}\s+" "$0" | head -1 |
|
|
59
|
+
awk -F "'" -v OFS="'" '{
|
|
60
|
+
for (i=2; i<=NF; i+=2) {
|
|
61
|
+
gsub(/ /, "_SPACE_", $i);
|
|
62
|
+
gsub(/\$/, "_DOLLAR_", $i);
|
|
63
|
+
gsub(/\(/, "_PARENTHESES_LEFT_", $i);
|
|
64
|
+
gsub(/\)/, "_PARENTHESES_RIGHT_", $i);
|
|
65
|
+
}
|
|
66
|
+
print
|
|
67
|
+
}' |
|
|
68
|
+
sed -e "s/\'//g"
|
|
69
|
+
)"
|
|
61
70
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
awk -F "'" -v OFS="'" '{
|
|
67
|
-
for (i=2; i<=NF; i+=2) {
|
|
68
|
-
gsub(/ /, "_SPACE_", $i);
|
|
69
|
-
gsub(/\$/, "_DOLLAR_", $i);
|
|
70
|
-
gsub(/\(/, "_PARENTHESES_LEFT_", $i);
|
|
71
|
-
gsub(/\)/, "_PARENTHESES_RIGHT_", $i);
|
|
72
|
-
}
|
|
73
|
-
print
|
|
74
|
-
}' |
|
|
75
|
-
sed -e "s/\'//g"
|
|
76
|
-
)"
|
|
77
|
-
|
|
78
|
-
if [[ -z ${validCommand} ]]; then
|
|
79
|
-
description="a valid value for ${element}"
|
|
80
|
-
else
|
|
81
|
-
if [[ "${validCommand}" =~ 'args_valid_or_select_pipe' ]]; then
|
|
82
|
-
prompt="$(reflect_nth_arg 4 "${validCommand}")"
|
|
83
|
-
possibleValues=", possible values: $(reflect_nth_arg 3 "$validCommand")"
|
|
84
|
-
elif [[ "${validCommand}" =~ 'args_valid_or_select_args' ]]; then
|
|
85
|
-
prompt="$(reflect_nth_arg 3 "${validCommand}")"
|
|
86
|
-
possibleValues=", you can select one using wizard if you do not know which value is valid"
|
|
87
|
-
elif [[ "${validCommand}" =~ 'args_valid_or_select' ]]; then
|
|
88
|
-
prompt="$(reflect_nth_arg 4 "${validCommand}")"
|
|
89
|
-
possibleValues=", you can select one using wizard if you do not know which value is valid"
|
|
71
|
+
if [[ -z ${validCommand} ]]; then
|
|
72
|
+
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
73
|
+
onlyPositionalVarNames+=("${element}")
|
|
74
|
+
description="a valid value for ${element}"
|
|
90
75
|
else
|
|
91
|
-
|
|
92
|
-
|
|
76
|
+
if [[ "${validCommand}" =~ 'args_valid_or_select_pipe' ]]; then
|
|
77
|
+
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
78
|
+
onlyPositionalVarNames+=("${element}")
|
|
79
|
+
prompt="$(reflect_nth_arg 4 "${validCommand}")"
|
|
80
|
+
possibleValues=", possible values: $(reflect_nth_arg 3 "$validCommand")"
|
|
81
|
+
elif [[ "${validCommand}" =~ 'args_valid_or_select_args' ]]; then
|
|
82
|
+
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
83
|
+
onlyPositionalVarNames+=("${element}")
|
|
84
|
+
prompt="$(reflect_nth_arg 3 "${validCommand}")"
|
|
85
|
+
possibleValues=", you can select one using wizard if you do not know which value is valid"
|
|
86
|
+
elif [[ "${validCommand}" =~ 'args_valid_or_select' ]]; then
|
|
87
|
+
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
88
|
+
onlyPositionalVarNames+=("${element}")
|
|
89
|
+
prompt="$(reflect_nth_arg 4 "${validCommand}")"
|
|
90
|
+
possibleValues=", you can select one using wizard if you do not know which value is valid"
|
|
91
|
+
elif [[ "${validCommand}" =~ args_valid_or_read ]]; then
|
|
92
|
+
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
93
|
+
onlyPositionalVarNames+=("${element}")
|
|
94
|
+
prompt="$(reflect_nth_arg 4 "${validCommand}")"
|
|
95
|
+
if [[ -n $(reflect_nth_arg 5 "${validCommand}") ]]; then
|
|
96
|
+
prompt="${prompt}, proposed value: $(reflect_nth_arg 5 "${validCommand}")"
|
|
97
|
+
fi
|
|
98
|
+
possibleValues=""
|
|
99
|
+
elif [[ "${validCommand}" =~ args_valid_or_default ]]; then
|
|
100
|
+
prompt="optional, $(reflect_nth_arg 4 "${validCommand}"). should be set like '${element}=value' before ${THIS_SCRIPT_NAME} or export to OS environment"
|
|
101
|
+
if [[ -n $(reflect_nth_arg 5 "${validCommand}") ]]; then
|
|
102
|
+
prompt="${prompt}. if absent, fallback to: $(reflect_nth_arg 5 "${validCommand}")"
|
|
103
|
+
else
|
|
104
|
+
prompt="${prompt}, empty if absent"
|
|
105
|
+
fi
|
|
106
|
+
possibleValues=""
|
|
107
|
+
fi
|
|
108
|
+
|
|
109
|
+
prompt="$(
|
|
110
|
+
echo "${prompt}" |
|
|
111
|
+
string_replace "_SPACE_" " " |
|
|
112
|
+
string_replace "_DOLLAR_" "$" |
|
|
113
|
+
string_replace "_PARENTHESES_LEFT_" "(" |
|
|
114
|
+
string_replace "_PARENTHESES_RIGHT_" ")"
|
|
115
|
+
)"
|
|
116
|
+
|
|
117
|
+
description="${prompt}${possibleValues}"
|
|
93
118
|
fi
|
|
119
|
+
descriptions+="$(printf "\n %-20s%s" "${element} " "${description}")"
|
|
120
|
+
done
|
|
121
|
+
fi
|
|
94
122
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
string_replace "_PARENTHESES_LEFT_" "(" |
|
|
100
|
-
string_replace "_PARENTHESES_RIGHT_" ")"
|
|
101
|
-
)"
|
|
102
|
-
|
|
103
|
-
description="${prompt}${possibleValues}"
|
|
104
|
-
fi
|
|
105
|
-
|
|
106
|
-
descriptions+="$(printf "\n %-20s%s" "${element} " "${description}")"
|
|
107
|
-
done
|
|
123
|
+
if [ ${#onlyPositionalVarNames[@]} -gt 0 ]; then
|
|
124
|
+
strPositionalVarNames=" $(array_join ' ' onlyPositionalVarNames)"
|
|
125
|
+
strPositionalValuesExamples=" \"$(array_join 'Value" "' onlyPositionalVarNames)Value\""
|
|
126
|
+
fi
|
|
108
127
|
|
|
109
128
|
declare_heredoc defaultUsage <<-EOF
|
|
110
129
|
${COLOR_BOLD_YELLOW}NAME${COLOR_END}
|
|
111
130
|
${THIS_SCRIPT_NAME} -- ${SHORT_DESC}
|
|
112
131
|
|
|
113
132
|
${COLOR_BOLD_YELLOW}SYNOPSIS${COLOR_END}
|
|
114
|
-
./${THIS_SCRIPT_NAME} [-qh]${strPositionalVarNames}
|
|
133
|
+
[optionalVariable=value ...] ./${THIS_SCRIPT_NAME} [-qh]${strPositionalVarNames}
|
|
115
134
|
|
|
116
135
|
${COLOR_BOLD_YELLOW}DESCRIPTION${COLOR_END}
|
|
117
136
|
[-h] help, print the usage
|
|
@@ -128,6 +147,9 @@ function args_parse() {
|
|
|
128
147
|
run using wizard, input value for params step by step:
|
|
129
148
|
./${THIS_SCRIPT_NAME}
|
|
130
149
|
|
|
150
|
+
run with optional variables, example:
|
|
151
|
+
myOpt1=myValue1 myOpt2=myValue2 ./${THIS_SCRIPT_NAME}
|
|
152
|
+
|
|
131
153
|
or you can run with some params, and input value for other params using wizard.
|
|
132
154
|
EOF
|
|
133
155
|
|
|
@@ -152,7 +174,7 @@ function args_parse() {
|
|
|
152
174
|
# varEmpty=""
|
|
153
175
|
# args_valid_or_select varEmpty arr "Which app"
|
|
154
176
|
# @SEE_ALSO
|
|
155
|
-
# args_valid_or_select_pipe, args_valid_or_read
|
|
177
|
+
# args_valid_or_select_pipe, args_valid_or_read, args_valid_or_default
|
|
156
178
|
function args_valid_or_select() {
|
|
157
179
|
local valueVarName validValuesVarName prompt value validValues PS3
|
|
158
180
|
valueVarName="${1}"
|
|
@@ -187,7 +209,7 @@ function args_valid_or_select() {
|
|
|
187
209
|
# sel="abc"
|
|
188
210
|
# args_valid_or_select_pipe sel "a|ab|d" "which value"
|
|
189
211
|
# @SEE_ALSO
|
|
190
|
-
# args_valid_or_select, args_valid_or_select_args, args_valid_or_read
|
|
212
|
+
# args_valid_or_select, args_valid_or_select_args, args_valid_or_read, args_valid_or_default
|
|
191
213
|
function args_valid_or_select_pipe() {
|
|
192
214
|
local valueVarName validValues prompt newArray
|
|
193
215
|
valueVarName="${1}"
|
|
@@ -210,7 +232,7 @@ function args_valid_or_select_pipe() {
|
|
|
210
232
|
# sel="abc"
|
|
211
233
|
# args_valid_or_select_args sel "which value" "a" "ab" "d"
|
|
212
234
|
# @SEE_ALSO
|
|
213
|
-
# args_valid_or_select, args_valid_or_select_pipe, args_valid_or_read
|
|
235
|
+
# args_valid_or_select, args_valid_or_select_pipe, args_valid_or_read, args_valid_or_default
|
|
214
236
|
function args_valid_or_select_args() {
|
|
215
237
|
local valueVarName value prompt PS3
|
|
216
238
|
valueVarName="${1}"
|
|
@@ -245,7 +267,7 @@ function args_valid_or_select_args() {
|
|
|
245
267
|
# args_valid_or_read destProjectIRN '^[0-9]{5,5}$' "IRN (only the 5 digits)"
|
|
246
268
|
# args_valid_or_read destRootPackage '^.+$' "Destination root package" "${defaultDestRootPackage}"
|
|
247
269
|
# @SEE_ALSO
|
|
248
|
-
# args_valid_or_select, args_valid_or_select_args, args_valid_or_select_pipe
|
|
270
|
+
# args_valid_or_select, args_valid_or_select_args, args_valid_or_select_pipe, args_valid_or_default
|
|
249
271
|
function args_valid_or_read() {
|
|
250
272
|
local value regExp prompt proposedValue
|
|
251
273
|
value=$(eval eval "echo '$'$1")
|
|
@@ -270,6 +292,42 @@ function args_valid_or_read() {
|
|
|
270
292
|
printf "Inputted value: ${COLOR_BLUE}'%s'${COLOR_END}\n" "$(eval echo '$'"${1}")"
|
|
271
293
|
}
|
|
272
294
|
|
|
295
|
+
# @NAME
|
|
296
|
+
# args_valid_or_default -- description of the optional params, value will fallback to empty or default if it no match the regular expression.
|
|
297
|
+
# @SYNOPSIS
|
|
298
|
+
# args_valid_or_default valueVarName strRegExp prompt [defaultValue]
|
|
299
|
+
# @DESCRIPTION
|
|
300
|
+
# the optional params should be set in OS environment like 'export optional_variable=value && ./my_script.sh',
|
|
301
|
+
# or be placed before the $0 like 'optionalVariable1=value1 optionalVariable2=value2 ./my_script.sh'.
|
|
302
|
+
#
|
|
303
|
+
# **valueVarName** the variable name of the value to valid and the new value assign to,
|
|
304
|
+
# **strRegExp** a string of regular expression to be used for validation
|
|
305
|
+
# **prompt** the description of the argument in generated help usage
|
|
306
|
+
# **[defaultValue]** optional, the default value to fallback on
|
|
307
|
+
# @EXAMPLES
|
|
308
|
+
# args_valid_or_default destProjectSIA '^[0-9a-z]{3,3}$' "SIA (lowercase, 3 chars)"
|
|
309
|
+
# args_valid_or_default destProjectIRN '^[0-9]{5,5}$' "IRN (only the 5 digits)"
|
|
310
|
+
# args_valid_or_default destRootPackage '^.+$' "Destination root package" "${defaultDestRootPackage}"
|
|
311
|
+
# @SEE_ALSO
|
|
312
|
+
# args_valid_or_select, args_valid_or_select_args, args_valid_or_select_pipe, args_valid_or_read
|
|
313
|
+
function args_valid_or_default() {
|
|
314
|
+
local value regExp prompt defaultValue
|
|
315
|
+
value=$(eval eval "echo '$'$1")
|
|
316
|
+
regExp=${2}
|
|
317
|
+
prompt="${3}"
|
|
318
|
+
defaultValue="${4}"
|
|
319
|
+
|
|
320
|
+
if [[ -z "${value}" || ! ${value} =~ ${regExp} ]]; then
|
|
321
|
+
prompt="for param ${1}:"
|
|
322
|
+
[[ -n "${value}" ]] && prompt+=" the input '${value}' is not valid" || prompt+=" no input"
|
|
323
|
+
[[ -n "${defaultValue}" ]] && prompt+=", fallback to default value '${defaultValue}'" || prompt+=", fallback to empty"
|
|
324
|
+
print_warn "${prompt}"
|
|
325
|
+
value="${defaultValue}"
|
|
326
|
+
fi
|
|
327
|
+
eval "${1}='${value}'"
|
|
328
|
+
printf "Inputted value: ${COLOR_BLUE}'%s'${COLOR_END}\n" "$(eval echo '$'"${1}")"
|
|
329
|
+
}
|
|
330
|
+
|
|
273
331
|
# @NAME
|
|
274
332
|
# array_join -- join an array to string using delimiter string
|
|
275
333
|
# @SYNOPSIS
|
package/docs/git.io.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Shorten URL
|
|
2
2
|
|
|
3
3
|
https://github.com/renault-digital/bash-base/raw/master/scripts/install.sh => url=https://raw.githubusercontent.com/renault-digital/bash-base/master/scripts/install.sh
|
|
4
|
+
|
|
4
5
|
https://github.com/renault-digital/bash-base/raw/master/bin/bash-base => url=https://raw.githubusercontent.com/renault-digital/bash-base/master/bin/bash-base
|
|
5
6
|
|
|
6
7
|
```shell
|
package/docs/references.md
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
- args_valid_or_select_pipe
|
|
8
8
|
- args_valid_or_select_args
|
|
9
9
|
- args_valid_or_read
|
|
10
|
+
- args_valid_or_default
|
|
10
11
|
- array_join
|
|
11
12
|
- array_describe
|
|
12
13
|
- array_from_describe
|
|
@@ -112,7 +113,7 @@ args_valid_or_select varEmpty arr "Which app"
|
|
|
112
113
|
```
|
|
113
114
|
|
|
114
115
|
##### SEE_ALSO
|
|
115
|
-
args_valid_or_select_pipe, args_valid_or_read
|
|
116
|
+
args_valid_or_select_pipe, args_valid_or_read, args_valid_or_default
|
|
116
117
|
|
|
117
118
|
---
|
|
118
119
|
|
|
@@ -136,7 +137,7 @@ args_valid_or_select_pipe sel "a|ab|d" "which value"
|
|
|
136
137
|
```
|
|
137
138
|
|
|
138
139
|
##### SEE_ALSO
|
|
139
|
-
args_valid_or_select, args_valid_or_select_args, args_valid_or_read
|
|
140
|
+
args_valid_or_select, args_valid_or_select_args, args_valid_or_read, args_valid_or_default
|
|
140
141
|
|
|
141
142
|
---
|
|
142
143
|
|
|
@@ -160,7 +161,7 @@ args_valid_or_select_args sel "which value" "a" "ab" "d"
|
|
|
160
161
|
```
|
|
161
162
|
|
|
162
163
|
##### SEE_ALSO
|
|
163
|
-
args_valid_or_select, args_valid_or_select_pipe, args_valid_or_read
|
|
164
|
+
args_valid_or_select, args_valid_or_select_pipe, args_valid_or_read, args_valid_or_default
|
|
164
165
|
|
|
165
166
|
---
|
|
166
167
|
|
|
@@ -186,7 +187,36 @@ args_valid_or_read destRootPackage '^.+$' "Destination root package" "${defaultD
|
|
|
186
187
|
```
|
|
187
188
|
|
|
188
189
|
##### SEE_ALSO
|
|
189
|
-
args_valid_or_select, args_valid_or_select_args, args_valid_or_select_pipe
|
|
190
|
+
args_valid_or_select, args_valid_or_select_args, args_valid_or_select_pipe, args_valid_or_default
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
##### NAME
|
|
195
|
+
args_valid_or_default -- description of the optional params, value will fallback to empty or default if it no match the regular expression.
|
|
196
|
+
|
|
197
|
+
##### SYNOPSIS
|
|
198
|
+
```
|
|
199
|
+
args_valid_or_default valueVarName strRegExp prompt [defaultValue]
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
##### DESCRIPTION
|
|
203
|
+
the optional params should be set in OS environment like 'export optional_variable=value && ./my_script.sh',
|
|
204
|
+
or be placed before the $0 like 'optionalVariable1=value1 optionalVariable2=value2 ./my_script.sh'.
|
|
205
|
+
|
|
206
|
+
- **valueVarName** the variable name of the value to valid and the new value assign to,
|
|
207
|
+
- **strRegExp** a string of regular expression to be used for validation
|
|
208
|
+
- **prompt** the description of the argument in generated help usage
|
|
209
|
+
- **[defaultValue]** optional, the default value to fallback on
|
|
210
|
+
|
|
211
|
+
##### EXAMPLES
|
|
212
|
+
```
|
|
213
|
+
args_valid_or_default destProjectSIA '^[0-9a-z]{3,3}$' "SIA (lowercase, 3 chars)"
|
|
214
|
+
args_valid_or_default destProjectIRN '^[0-9]{5,5}$' "IRN (only the 5 digits)"
|
|
215
|
+
args_valid_or_default destRootPackage '^.+$' "Destination root package" "${defaultDestRootPackage}"
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
##### SEE_ALSO
|
|
219
|
+
args_valid_or_select, args_valid_or_select_args, args_valid_or_select_pipe, args_valid_or_read
|
|
190
220
|
|
|
191
221
|
---
|
|
192
222
|
|
package/man/bash-base.1
CHANGED
|
@@ -62,7 +62,7 @@ args_valid_or_select varEmpty arr \[dq]Which app\[dq]
|
|
|
62
62
|
.fi
|
|
63
63
|
.SS SEE_ALSO
|
|
64
64
|
.PP
|
|
65
|
-
args_valid_or_select_pipe, args_valid_or_read
|
|
65
|
+
args_valid_or_select_pipe, args_valid_or_read, args_valid_or_default
|
|
66
66
|
.PP
|
|
67
67
|
* * * * *
|
|
68
68
|
.SS NAME
|
|
@@ -96,7 +96,8 @@ args_valid_or_select_pipe sel \[dq]a|ab|d\[dq] \[dq]which value\[dq]
|
|
|
96
96
|
.fi
|
|
97
97
|
.SS SEE_ALSO
|
|
98
98
|
.PP
|
|
99
|
-
args_valid_or_select, args_valid_or_select_args, args_valid_or_read
|
|
99
|
+
args_valid_or_select, args_valid_or_select_args, args_valid_or_read,
|
|
100
|
+
args_valid_or_default
|
|
100
101
|
.PP
|
|
101
102
|
* * * * *
|
|
102
103
|
.SS NAME
|
|
@@ -131,7 +132,8 @@ args_valid_or_select_args sel \[dq]which value\[dq] \[dq]a\[dq] \[dq]ab\[dq] \[d
|
|
|
131
132
|
.fi
|
|
132
133
|
.SS SEE_ALSO
|
|
133
134
|
.PP
|
|
134
|
-
args_valid_or_select, args_valid_or_select_pipe, args_valid_or_read
|
|
135
|
+
args_valid_or_select, args_valid_or_select_pipe, args_valid_or_read,
|
|
136
|
+
args_valid_or_default
|
|
135
137
|
.PP
|
|
136
138
|
* * * * *
|
|
137
139
|
.SS NAME
|
|
@@ -171,7 +173,48 @@ args_valid_or_read destRootPackage \[aq]\[ha].+$\[aq] \[dq]Destination root pack
|
|
|
171
173
|
.SS SEE_ALSO
|
|
172
174
|
.PP
|
|
173
175
|
args_valid_or_select, args_valid_or_select_args,
|
|
174
|
-
args_valid_or_select_pipe
|
|
176
|
+
args_valid_or_select_pipe, args_valid_or_default
|
|
177
|
+
.PP
|
|
178
|
+
* * * * *
|
|
179
|
+
.SS NAME
|
|
180
|
+
.PP
|
|
181
|
+
args_valid_or_default \[en] description of the optional params, value
|
|
182
|
+
will fallback to empty or default if it no match the regular expression.
|
|
183
|
+
.SS SYNOPSIS
|
|
184
|
+
.IP
|
|
185
|
+
.nf
|
|
186
|
+
\f[C]
|
|
187
|
+
args_valid_or_default valueVarName strRegExp prompt [defaultValue]
|
|
188
|
+
\f[R]
|
|
189
|
+
.fi
|
|
190
|
+
.SS DESCRIPTION
|
|
191
|
+
.PP
|
|
192
|
+
the optional params should be set in OS environment like `export
|
|
193
|
+
optional_variable=value && ./my_script.sh', or be placed before the $0
|
|
194
|
+
like `optionalVariable1=value1 optionalVariable2=value2 ./my_script.sh'.
|
|
195
|
+
.IP \[bu] 2
|
|
196
|
+
\f[B]valueVarName\f[R] the variable name of the value to valid and the
|
|
197
|
+
new value assign to,
|
|
198
|
+
.IP \[bu] 2
|
|
199
|
+
\f[B]strRegExp\f[R] a string of regular expression to be used for
|
|
200
|
+
validation
|
|
201
|
+
.IP \[bu] 2
|
|
202
|
+
\f[B]prompt\f[R] the description of the argument in generated help usage
|
|
203
|
+
.IP \[bu] 2
|
|
204
|
+
\f[B][defaultValue]\f[R] optional, the default value to fallback on
|
|
205
|
+
.SS EXAMPLES
|
|
206
|
+
.IP
|
|
207
|
+
.nf
|
|
208
|
+
\f[C]
|
|
209
|
+
args_valid_or_default destProjectSIA \[aq]\[ha][0-9a-z]{3,3}$\[aq] \[dq]SIA (lowercase, 3 chars)\[dq]
|
|
210
|
+
args_valid_or_default destProjectIRN \[aq]\[ha][0-9]{5,5}$\[aq] \[dq]IRN (only the 5 digits)\[dq]
|
|
211
|
+
args_valid_or_default destRootPackage \[aq]\[ha].+$\[aq] \[dq]Destination root package\[dq] \[dq]${defaultDestRootPackage}\[dq]
|
|
212
|
+
\f[R]
|
|
213
|
+
.fi
|
|
214
|
+
.SS SEE_ALSO
|
|
215
|
+
.PP
|
|
216
|
+
args_valid_or_select, args_valid_or_select_args,
|
|
217
|
+
args_valid_or_select_pipe, args_valid_or_read
|
|
175
218
|
.PP
|
|
176
219
|
* * * * *
|
|
177
220
|
.SS NAME
|
package/package-lock.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@renault-digital/bash-base",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.2",
|
|
4
4
|
"lockfileVersion": 1,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"dependencies": {
|
|
@@ -2585,9 +2585,9 @@
|
|
|
2585
2585
|
"dev": true
|
|
2586
2586
|
},
|
|
2587
2587
|
"path-parse": {
|
|
2588
|
-
"version": "1.0.
|
|
2589
|
-
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.
|
|
2590
|
-
"integrity": "sha512-
|
|
2588
|
+
"version": "1.0.7",
|
|
2589
|
+
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
|
2590
|
+
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
|
|
2591
2591
|
"dev": true
|
|
2592
2592
|
},
|
|
2593
2593
|
"path-type": {
|
package/package.json
CHANGED
package/spec/argument.spec.sh
CHANGED
|
@@ -51,7 +51,7 @@ Describe args_parse
|
|
|
51
51
|
my_script.sh -- my script
|
|
52
52
|
|
|
53
53
|
${COLOR_BOLD_YELLOW}SYNOPSIS${COLOR_END}
|
|
54
|
-
./my_script.sh [-qh]
|
|
54
|
+
[optionalVariable=value ...] ./my_script.sh [-qh]
|
|
55
55
|
|
|
56
56
|
${COLOR_BOLD_YELLOW}DESCRIPTION${COLOR_END}
|
|
57
57
|
[-h] help, print the usage
|
|
@@ -68,6 +68,9 @@ Describe args_parse
|
|
|
68
68
|
run using wizard, input value for params step by step:
|
|
69
69
|
./my_script.sh
|
|
70
70
|
|
|
71
|
+
run with optional variables, example:
|
|
72
|
+
myOpt1=myValue1 myOpt2=myValue2 ./my_script.sh
|
|
73
|
+
|
|
71
74
|
or you can run with some params, and input value for other params using wizard.
|
|
72
75
|
EOF
|
|
73
76
|
|
|
@@ -103,7 +106,7 @@ Describe args_parse
|
|
|
103
106
|
my_script.sh -- my script
|
|
104
107
|
|
|
105
108
|
${COLOR_BOLD_YELLOW}SYNOPSIS${COLOR_END}
|
|
106
|
-
./my_script.sh [-qh] destGitRepoURL
|
|
109
|
+
[optionalVariable=value ...] ./my_script.sh [-qh] destGitRepoURL
|
|
107
110
|
|
|
108
111
|
${COLOR_BOLD_YELLOW}DESCRIPTION${COLOR_END}
|
|
109
112
|
[-h] help, print the usage
|
|
@@ -121,6 +124,9 @@ Describe args_parse
|
|
|
121
124
|
run using wizard, input value for params step by step:
|
|
122
125
|
./my_script.sh
|
|
123
126
|
|
|
127
|
+
run with optional variables, example:
|
|
128
|
+
myOpt1=myValue1 myOpt2=myValue2 ./my_script.sh
|
|
129
|
+
|
|
124
130
|
or you can run with some params, and input value for other params using wizard.
|
|
125
131
|
EOF
|
|
126
132
|
|
|
@@ -156,15 +162,17 @@ Describe args_parse
|
|
|
156
162
|
|
|
157
163
|
SHORT_DESC='this is a script for test generated help usage'
|
|
158
164
|
|
|
159
|
-
args_parse \$# "\$@" myVar1 myVar2 myVar3 myVar4 myVar44 myVar5 fromEnv varWithoutValidation order
|
|
165
|
+
args_parse \$# "\$@" myVar1 myVar2 myVar3 myVar4 myVar44 myVar5 fromEnv varWithoutValidation order myOptionalVar myOptionalVar2
|
|
160
166
|
args_valid_or_read myVar1 '^[0-9a-z ]{3,}$' 'SIA (lowercase, 3 chars)'
|
|
161
167
|
args_valid_or_read myVar2 '^[0-9a-z ]{3,}$' 'SIA lowercase, 3 chars'
|
|
162
168
|
args_valid_or_read myVar3 '^[0-9a-z ]{3,}$' 'SIA [lowercase, 3 chars]'
|
|
163
169
|
args_valid_or_read myVar4 '^[0-9a-z ]{3,}$' 'SIA lowercase, 3 chars'
|
|
164
170
|
args_valid_or_select myVar44 arrBranchesToSelectCleaned "The base of merge request (normally it is develop or integration)"
|
|
165
|
-
args_valid_or_read myVar5 '^[0-9a-z ]{3,}$' 'SIA !lowercase, 3 chars'
|
|
171
|
+
args_valid_or_read myVar5 '^[0-9a-z ]{3,}$' 'SIA !lowercase, 3 chars' default
|
|
166
172
|
args_valid_or_select_pipe fromEnv 'int/qua/sta/rec/ope' "Which env of DCP Alpine" int
|
|
167
173
|
args_valid_or_select_args order "Which order" first "second one"
|
|
174
|
+
args_valid_or_default myOptionalVar '^[0-9a-z ]{3,}$' 'SIA !lowercase, 3 chars' default
|
|
175
|
+
args_valid_or_default myOptionalVar2 '^[0-9a-z ]{3,}$' 'SIA !lowercase, 3 chars'
|
|
168
176
|
EOF
|
|
169
177
|
chmod +x my_script.sh
|
|
170
178
|
|
|
@@ -173,7 +181,7 @@ Describe args_parse
|
|
|
173
181
|
my_script.sh -- this is a script for test generated help usage
|
|
174
182
|
|
|
175
183
|
${COLOR_BOLD_YELLOW}SYNOPSIS${COLOR_END}
|
|
176
|
-
./my_script.sh [-qh] myVar1 myVar2 myVar3 myVar4 myVar44 myVar5 fromEnv varWithoutValidation order
|
|
184
|
+
[optionalVariable=value ...] ./my_script.sh [-qh] myVar1 myVar2 myVar3 myVar4 myVar44 myVar5 fromEnv varWithoutValidation order
|
|
177
185
|
|
|
178
186
|
${COLOR_BOLD_YELLOW}DESCRIPTION${COLOR_END}
|
|
179
187
|
[-h] help, print the usage
|
|
@@ -184,10 +192,12 @@ Describe args_parse
|
|
|
184
192
|
myVar3 SIA [lowercase, 3 chars]
|
|
185
193
|
myVar4 SIA lowercase, 3 chars
|
|
186
194
|
myVar44 The base of merge request (normally it is develop or integration), you can select one using wizard if you do not know which value is valid
|
|
187
|
-
myVar5 SIA !lowercase, 3 chars
|
|
195
|
+
myVar5 SIA !lowercase, 3 chars, proposed value: default
|
|
188
196
|
fromEnv Which env of DCP Alpine, possible values: int/qua/sta/rec/ope
|
|
189
197
|
varWithoutValidation a valid value for varWithoutValidation
|
|
190
198
|
order Which order, you can select one using wizard if you do not know which value is valid
|
|
199
|
+
myOptionalVar optional, SIA !lowercase, 3 chars. should be set like myOptionalVar=value before my_script.sh or export to OS environment. if absent, fallback to: default
|
|
200
|
+
myOptionalVar2 optional, SIA !lowercase, 3 chars. should be set like myOptionalVar2=value before my_script.sh or export to OS environment, empty if absent
|
|
191
201
|
|
|
192
202
|
${COLOR_BOLD_YELLOW}EXAMPLES${COLOR_END}
|
|
193
203
|
help, print the usage:
|
|
@@ -199,6 +209,9 @@ Describe args_parse
|
|
|
199
209
|
run using wizard, input value for params step by step:
|
|
200
210
|
./my_script.sh
|
|
201
211
|
|
|
212
|
+
run with optional variables, example:
|
|
213
|
+
myOpt1=myValue1 myOpt2=myValue2 ./my_script.sh
|
|
214
|
+
|
|
202
215
|
or you can run with some params, and input value for other params using wizard.
|
|
203
216
|
EOF
|
|
204
217
|
)
|
|
@@ -367,3 +380,48 @@ Describe args_valid_or_read
|
|
|
367
380
|
The output should eq "Inputted value: ${COLOR_BLUE}'70033'${COLOR_END}"
|
|
368
381
|
End
|
|
369
382
|
End
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
Describe args_valid_or_default
|
|
386
|
+
It 'the value is unset'
|
|
387
|
+
When call eval "args_valid_or_default irn '^[0-9]{5,5}$' 'IRN (only the 5 digits)' | grep 'Inputted'"
|
|
388
|
+
The output should eq "Inputted value: ${COLOR_BLUE}''${COLOR_END}"
|
|
389
|
+
The error should eq ""
|
|
390
|
+
End
|
|
391
|
+
|
|
392
|
+
It 'the value is empty'
|
|
393
|
+
irn=""
|
|
394
|
+
When call eval "args_valid_or_default irn '^[0-9]{5,5}$' 'IRN (only the 5 digits)' | grep 'Inputted'"
|
|
395
|
+
The output should eq "Inputted value: ${COLOR_BLUE}''${COLOR_END}"
|
|
396
|
+
End
|
|
397
|
+
|
|
398
|
+
It "the value is not valid"
|
|
399
|
+
irn="225"
|
|
400
|
+
When call eval "args_valid_or_default irn '^[0-9]{5,5}$' 'IRN (only the 5 digits)' | grep 'Inputted'"
|
|
401
|
+
The output should eq "Inputted value: ${COLOR_BLUE}''${COLOR_END}"
|
|
402
|
+
End
|
|
403
|
+
|
|
404
|
+
It "the value is valid"
|
|
405
|
+
irn="70033"
|
|
406
|
+
When call eval "args_valid_or_default irn '^[0-9]{5,5}$' 'IRN (only the 5 digits)'"
|
|
407
|
+
The variable irn should eq "70033"
|
|
408
|
+
The output should eq "Inputted value: ${COLOR_BLUE}'70033'${COLOR_END}"
|
|
409
|
+
End
|
|
410
|
+
|
|
411
|
+
It 'take proposedValue when the value is unset'
|
|
412
|
+
When call eval "args_valid_or_default irn '^[0-9]{5,5}$' 'IRN (only the 5 digits)' 70088 | grep 'Inputted'"
|
|
413
|
+
The output should eq "Inputted value: ${COLOR_BLUE}'70088'${COLOR_END}"
|
|
414
|
+
End
|
|
415
|
+
|
|
416
|
+
It 'take proposedValue when the value is empty'
|
|
417
|
+
irn=""
|
|
418
|
+
When call eval "args_valid_or_default irn '^[0-9]{5,5}$' 'IRN (only the 5 digits)' 70088 | grep 'Inputted'"
|
|
419
|
+
The output should eq "Inputted value: ${COLOR_BLUE}'70088'${COLOR_END}"
|
|
420
|
+
End
|
|
421
|
+
|
|
422
|
+
It 'not take proposedValue when value is valid'
|
|
423
|
+
irn="70033"
|
|
424
|
+
When call eval "args_valid_or_default irn '^[0-9]{5,5}$' 'IRN (only the 5 digits)' 70088 | grep 'Inputted'"
|
|
425
|
+
The output should eq "Inputted value: ${COLOR_BLUE}'70033'${COLOR_END}"
|
|
426
|
+
End
|
|
427
|
+
End
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#shellcheck shell=bash
|
|
2
|
+
|
|
3
|
+
Include src/array.sh
|
|
4
|
+
Include src/tool.sh
|
|
5
|
+
Include src/string.sh
|
|
6
|
+
Include src/reflection.sh
|
|
7
|
+
Include src/argument.sh
|
|
8
|
+
|
|
9
|
+
preserve() { %preserve actual status output error; }
|
|
10
|
+
AfterRun preserve
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
Describe integ_test
|
|
14
|
+
|
|
15
|
+
It 'run script'
|
|
16
|
+
cat <<-EOF > my_script.sh
|
|
17
|
+
#!/usr/bin/env bash
|
|
18
|
+
|
|
19
|
+
source src/array.sh
|
|
20
|
+
source src/tool.sh
|
|
21
|
+
source src/string.sh
|
|
22
|
+
source src/reflection.sh
|
|
23
|
+
source src/argument.sh
|
|
24
|
+
|
|
25
|
+
# customize the short description of default help usage
|
|
26
|
+
SHORT_DESC='an example shell script to show how to use bash-base '
|
|
27
|
+
|
|
28
|
+
print_header "collect information"
|
|
29
|
+
args_parse \$# "\$@" firstName lastName age sex country nationality
|
|
30
|
+
|
|
31
|
+
args_valid_or_read firstName '^[A-Za-z ]{2,}$' "Your first name (only letters)"
|
|
32
|
+
args_valid_or_read lastName '^[A-Za-z ]{2,}$' "Your last name (only letters)"
|
|
33
|
+
args_valid_or_read age '^[0-9]{1,2}$' "Your age (maxim 2 digits))"
|
|
34
|
+
args_valid_or_select_pipe sex 'man|woman' "Your sex"
|
|
35
|
+
args_valid_or_select_args country "Which country" France USA
|
|
36
|
+
args_valid_or_default nationality '^[A-Za-z ]{1,}$' "Your nationality" French
|
|
37
|
+
|
|
38
|
+
confirm_to_continue firstName lastName age sex country nationality
|
|
39
|
+
|
|
40
|
+
print_header "say hello"
|
|
41
|
+
cat <<-EOF2
|
|
42
|
+
Hello \$(string_upper_first "\${firstName}") \$(string_upper "\${lastName}"),
|
|
43
|
+
nice to meet you, you are really \${nationality}
|
|
44
|
+
EOF2
|
|
45
|
+
EOF
|
|
46
|
+
chmod +x my_script.sh
|
|
47
|
+
|
|
48
|
+
expected=$(cat <<-EOF
|
|
49
|
+
${COLOR_BOLD_MAGENTA}
|
|
50
|
+
### collect information ${COLOR_END}
|
|
51
|
+
Inputted value: ${COLOR_BLUE}'First'${COLOR_END}
|
|
52
|
+
Inputted value: ${COLOR_BLUE}'LAST'${COLOR_END}
|
|
53
|
+
Inputted value: ${COLOR_BLUE}'22'${COLOR_END}
|
|
54
|
+
Selected value: ${COLOR_BLUE}'woman'${COLOR_END}
|
|
55
|
+
Selected value: ${COLOR_BLUE}'USA'${COLOR_END}
|
|
56
|
+
Inputted value: ${COLOR_BLUE}'American'${COLOR_END}
|
|
57
|
+
firstName: ${COLOR_BLUE}First${COLOR_END}
|
|
58
|
+
lastName: ${COLOR_BLUE}LAST${COLOR_END}
|
|
59
|
+
age: ${COLOR_BLUE}22${COLOR_END}
|
|
60
|
+
sex: ${COLOR_BLUE}woman${COLOR_END}
|
|
61
|
+
country: ${COLOR_BLUE}USA${COLOR_END}
|
|
62
|
+
nationality: ${COLOR_BLUE}American${COLOR_END}
|
|
63
|
+
${COLOR_BOLD_MAGENTA}
|
|
64
|
+
### say hello ${COLOR_END}
|
|
65
|
+
Hello First LAST,
|
|
66
|
+
nice to meet you, you are really American
|
|
67
|
+
EOF
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
export nationality=American
|
|
71
|
+
When run script my_script.sh -q First LAST 22 woman USA
|
|
72
|
+
The status should be success
|
|
73
|
+
The output should eq "$expected"
|
|
74
|
+
|
|
75
|
+
rm -fr my_script.sh
|
|
76
|
+
End
|
|
77
|
+
|
|
78
|
+
End
|
package/spec/reflection.spec.sh
CHANGED
|
@@ -120,7 +120,7 @@ Describe 'reflect_function_names_of_file'
|
|
|
120
120
|
When call reflect_function_names_of_file "${shellScriptFile}"
|
|
121
121
|
The status should eq "0"
|
|
122
122
|
The output should include "reflect_nth_arg"
|
|
123
|
-
The lines of output should eq
|
|
123
|
+
The lines of output should eq 65
|
|
124
124
|
|
|
125
125
|
rm -fr "${shellScriptFile}"
|
|
126
126
|
End
|
package/src/argument.sh
CHANGED
|
@@ -44,71 +44,90 @@ function args_parse() {
|
|
|
44
44
|
nbPositionalArgValues=$((nbArgValues - OPTIND + 1))
|
|
45
45
|
positionalArgValues=("${@:1:nbPositionalArgValues}")
|
|
46
46
|
positionalVarNames=("${@:nbPositionalArgValues+1:nbPositionalVarNames}")
|
|
47
|
-
if ((nbPositionalVarNames > 0)); then
|
|
48
|
-
for i in $(seq 0 $((nbPositionalVarNames - 1))); do
|
|
49
|
-
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
50
|
-
done
|
|
51
|
-
fi
|
|
52
47
|
|
|
53
|
-
|
|
48
|
+
onlyPositionalVarNames=()
|
|
49
|
+
descriptions=''
|
|
54
50
|
if ((nbPositionalVarNames > 0)); then
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
51
|
+
for i in $(seq 0 $((nbPositionalVarNames - 1))); do
|
|
52
|
+
element=${positionalVarNames[i]}
|
|
53
|
+
|
|
54
|
+
validCommand="$(
|
|
55
|
+
grep -E "^\s*args_valid.*\s+${element}\s+" "$0" | head -1 |
|
|
56
|
+
awk -F "'" -v OFS="'" '{
|
|
57
|
+
for (i=2; i<=NF; i+=2) {
|
|
58
|
+
gsub(/ /, "_SPACE_", $i);
|
|
59
|
+
gsub(/\$/, "_DOLLAR_", $i);
|
|
60
|
+
gsub(/\(/, "_PARENTHESES_LEFT_", $i);
|
|
61
|
+
gsub(/\)/, "_PARENTHESES_RIGHT_", $i);
|
|
62
|
+
}
|
|
63
|
+
print
|
|
64
|
+
}' |
|
|
65
|
+
sed -e "s/\'//g"
|
|
66
|
+
)"
|
|
58
67
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
awk -F "'" -v OFS="'" '{
|
|
64
|
-
for (i=2; i<=NF; i+=2) {
|
|
65
|
-
gsub(/ /, "_SPACE_", $i);
|
|
66
|
-
gsub(/\$/, "_DOLLAR_", $i);
|
|
67
|
-
gsub(/\(/, "_PARENTHESES_LEFT_", $i);
|
|
68
|
-
gsub(/\)/, "_PARENTHESES_RIGHT_", $i);
|
|
69
|
-
}
|
|
70
|
-
print
|
|
71
|
-
}' |
|
|
72
|
-
sed -e "s/\'//g"
|
|
73
|
-
)"
|
|
74
|
-
|
|
75
|
-
if [[ -z ${validCommand} ]]; then
|
|
76
|
-
description="a valid value for ${element}"
|
|
77
|
-
else
|
|
78
|
-
if [[ "${validCommand}" =~ 'args_valid_or_select_pipe' ]]; then
|
|
79
|
-
prompt="$(reflect_nth_arg 4 "${validCommand}")"
|
|
80
|
-
possibleValues=", possible values: $(reflect_nth_arg 3 "$validCommand")"
|
|
81
|
-
elif [[ "${validCommand}" =~ 'args_valid_or_select_args' ]]; then
|
|
82
|
-
prompt="$(reflect_nth_arg 3 "${validCommand}")"
|
|
83
|
-
possibleValues=", you can select one using wizard if you do not know which value is valid"
|
|
84
|
-
elif [[ "${validCommand}" =~ 'args_valid_or_select' ]]; then
|
|
85
|
-
prompt="$(reflect_nth_arg 4 "${validCommand}")"
|
|
86
|
-
possibleValues=", you can select one using wizard if you do not know which value is valid"
|
|
68
|
+
if [[ -z ${validCommand} ]]; then
|
|
69
|
+
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
70
|
+
onlyPositionalVarNames+=("${element}")
|
|
71
|
+
description="a valid value for ${element}"
|
|
87
72
|
else
|
|
88
|
-
|
|
89
|
-
|
|
73
|
+
if [[ "${validCommand}" =~ 'args_valid_or_select_pipe' ]]; then
|
|
74
|
+
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
75
|
+
onlyPositionalVarNames+=("${element}")
|
|
76
|
+
prompt="$(reflect_nth_arg 4 "${validCommand}")"
|
|
77
|
+
possibleValues=", possible values: $(reflect_nth_arg 3 "$validCommand")"
|
|
78
|
+
elif [[ "${validCommand}" =~ 'args_valid_or_select_args' ]]; then
|
|
79
|
+
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
80
|
+
onlyPositionalVarNames+=("${element}")
|
|
81
|
+
prompt="$(reflect_nth_arg 3 "${validCommand}")"
|
|
82
|
+
possibleValues=", you can select one using wizard if you do not know which value is valid"
|
|
83
|
+
elif [[ "${validCommand}" =~ 'args_valid_or_select' ]]; then
|
|
84
|
+
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
85
|
+
onlyPositionalVarNames+=("${element}")
|
|
86
|
+
prompt="$(reflect_nth_arg 4 "${validCommand}")"
|
|
87
|
+
possibleValues=", you can select one using wizard if you do not know which value is valid"
|
|
88
|
+
elif [[ "${validCommand}" =~ args_valid_or_read ]]; then
|
|
89
|
+
eval "${positionalVarNames[i]}='${positionalArgValues[i]}'"
|
|
90
|
+
onlyPositionalVarNames+=("${element}")
|
|
91
|
+
prompt="$(reflect_nth_arg 4 "${validCommand}")"
|
|
92
|
+
if [[ -n $(reflect_nth_arg 5 "${validCommand}") ]]; then
|
|
93
|
+
prompt="${prompt}, proposed value: $(reflect_nth_arg 5 "${validCommand}")"
|
|
94
|
+
fi
|
|
95
|
+
possibleValues=""
|
|
96
|
+
elif [[ "${validCommand}" =~ args_valid_or_default ]]; then
|
|
97
|
+
prompt="optional, $(reflect_nth_arg 4 "${validCommand}"). should be set like '${element}=value' before ${THIS_SCRIPT_NAME} or export to OS environment"
|
|
98
|
+
if [[ -n $(reflect_nth_arg 5 "${validCommand}") ]]; then
|
|
99
|
+
prompt="${prompt}. if absent, fallback to: $(reflect_nth_arg 5 "${validCommand}")"
|
|
100
|
+
else
|
|
101
|
+
prompt="${prompt}, empty if absent"
|
|
102
|
+
fi
|
|
103
|
+
possibleValues=""
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
prompt="$(
|
|
107
|
+
echo "${prompt}" |
|
|
108
|
+
string_replace "_SPACE_" " " |
|
|
109
|
+
string_replace "_DOLLAR_" "$" |
|
|
110
|
+
string_replace "_PARENTHESES_LEFT_" "(" |
|
|
111
|
+
string_replace "_PARENTHESES_RIGHT_" ")"
|
|
112
|
+
)"
|
|
113
|
+
|
|
114
|
+
description="${prompt}${possibleValues}"
|
|
90
115
|
fi
|
|
116
|
+
descriptions+="$(printf "\n %-20s%s" "${element} " "${description}")"
|
|
117
|
+
done
|
|
118
|
+
fi
|
|
91
119
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
string_replace "_PARENTHESES_LEFT_" "(" |
|
|
97
|
-
string_replace "_PARENTHESES_RIGHT_" ")"
|
|
98
|
-
)"
|
|
99
|
-
|
|
100
|
-
description="${prompt}${possibleValues}"
|
|
101
|
-
fi
|
|
102
|
-
|
|
103
|
-
descriptions+="$(printf "\n %-20s%s" "${element} " "${description}")"
|
|
104
|
-
done
|
|
120
|
+
if [ ${#onlyPositionalVarNames[@]} -gt 0 ]; then
|
|
121
|
+
strPositionalVarNames=" $(array_join ' ' onlyPositionalVarNames)"
|
|
122
|
+
strPositionalValuesExamples=" \"$(array_join 'Value" "' onlyPositionalVarNames)Value\""
|
|
123
|
+
fi
|
|
105
124
|
|
|
106
125
|
declare_heredoc defaultUsage <<-EOF
|
|
107
126
|
${COLOR_BOLD_YELLOW}NAME${COLOR_END}
|
|
108
127
|
${THIS_SCRIPT_NAME} -- ${SHORT_DESC}
|
|
109
128
|
|
|
110
129
|
${COLOR_BOLD_YELLOW}SYNOPSIS${COLOR_END}
|
|
111
|
-
./${THIS_SCRIPT_NAME} [-qh]${strPositionalVarNames}
|
|
130
|
+
[optionalVariable=value ...] ./${THIS_SCRIPT_NAME} [-qh]${strPositionalVarNames}
|
|
112
131
|
|
|
113
132
|
${COLOR_BOLD_YELLOW}DESCRIPTION${COLOR_END}
|
|
114
133
|
[-h] help, print the usage
|
|
@@ -125,6 +144,9 @@ function args_parse() {
|
|
|
125
144
|
run using wizard, input value for params step by step:
|
|
126
145
|
./${THIS_SCRIPT_NAME}
|
|
127
146
|
|
|
147
|
+
run with optional variables, example:
|
|
148
|
+
myOpt1=myValue1 myOpt2=myValue2 ./${THIS_SCRIPT_NAME}
|
|
149
|
+
|
|
128
150
|
or you can run with some params, and input value for other params using wizard.
|
|
129
151
|
EOF
|
|
130
152
|
|
|
@@ -149,7 +171,7 @@ function args_parse() {
|
|
|
149
171
|
# varEmpty=""
|
|
150
172
|
# args_valid_or_select varEmpty arr "Which app"
|
|
151
173
|
# @SEE_ALSO
|
|
152
|
-
# args_valid_or_select_pipe, args_valid_or_read
|
|
174
|
+
# args_valid_or_select_pipe, args_valid_or_read, args_valid_or_default
|
|
153
175
|
function args_valid_or_select() {
|
|
154
176
|
local valueVarName validValuesVarName prompt value validValues PS3
|
|
155
177
|
valueVarName="${1}"
|
|
@@ -184,7 +206,7 @@ function args_valid_or_select() {
|
|
|
184
206
|
# sel="abc"
|
|
185
207
|
# args_valid_or_select_pipe sel "a|ab|d" "which value"
|
|
186
208
|
# @SEE_ALSO
|
|
187
|
-
# args_valid_or_select, args_valid_or_select_args, args_valid_or_read
|
|
209
|
+
# args_valid_or_select, args_valid_or_select_args, args_valid_or_read, args_valid_or_default
|
|
188
210
|
function args_valid_or_select_pipe() {
|
|
189
211
|
local valueVarName validValues prompt newArray
|
|
190
212
|
valueVarName="${1}"
|
|
@@ -207,7 +229,7 @@ function args_valid_or_select_pipe() {
|
|
|
207
229
|
# sel="abc"
|
|
208
230
|
# args_valid_or_select_args sel "which value" "a" "ab" "d"
|
|
209
231
|
# @SEE_ALSO
|
|
210
|
-
# args_valid_or_select, args_valid_or_select_pipe, args_valid_or_read
|
|
232
|
+
# args_valid_or_select, args_valid_or_select_pipe, args_valid_or_read, args_valid_or_default
|
|
211
233
|
function args_valid_or_select_args() {
|
|
212
234
|
local valueVarName value prompt PS3
|
|
213
235
|
valueVarName="${1}"
|
|
@@ -242,7 +264,7 @@ function args_valid_or_select_args() {
|
|
|
242
264
|
# args_valid_or_read destProjectIRN '^[0-9]{5,5}$' "IRN (only the 5 digits)"
|
|
243
265
|
# args_valid_or_read destRootPackage '^.+$' "Destination root package" "${defaultDestRootPackage}"
|
|
244
266
|
# @SEE_ALSO
|
|
245
|
-
# args_valid_or_select, args_valid_or_select_args, args_valid_or_select_pipe
|
|
267
|
+
# args_valid_or_select, args_valid_or_select_args, args_valid_or_select_pipe, args_valid_or_default
|
|
246
268
|
function args_valid_or_read() {
|
|
247
269
|
local value regExp prompt proposedValue
|
|
248
270
|
value=$(eval eval "echo '$'$1")
|
|
@@ -266,3 +288,39 @@ function args_valid_or_read() {
|
|
|
266
288
|
eval "${1}='${value}'"
|
|
267
289
|
printf "Inputted value: ${COLOR_BLUE}'%s'${COLOR_END}\n" "$(eval echo '$'"${1}")"
|
|
268
290
|
}
|
|
291
|
+
|
|
292
|
+
# @NAME
|
|
293
|
+
# args_valid_or_default -- description of the optional params, value will fallback to empty or default if it no match the regular expression.
|
|
294
|
+
# @SYNOPSIS
|
|
295
|
+
# args_valid_or_default valueVarName strRegExp prompt [defaultValue]
|
|
296
|
+
# @DESCRIPTION
|
|
297
|
+
# the optional params should be set in OS environment like 'export optional_variable=value && ./my_script.sh',
|
|
298
|
+
# or be placed before the $0 like 'optionalVariable1=value1 optionalVariable2=value2 ./my_script.sh'.
|
|
299
|
+
#
|
|
300
|
+
# **valueVarName** the variable name of the value to valid and the new value assign to,
|
|
301
|
+
# **strRegExp** a string of regular expression to be used for validation
|
|
302
|
+
# **prompt** the description of the argument in generated help usage
|
|
303
|
+
# **[defaultValue]** optional, the default value to fallback on
|
|
304
|
+
# @EXAMPLES
|
|
305
|
+
# args_valid_or_default destProjectSIA '^[0-9a-z]{3,3}$' "SIA (lowercase, 3 chars)"
|
|
306
|
+
# args_valid_or_default destProjectIRN '^[0-9]{5,5}$' "IRN (only the 5 digits)"
|
|
307
|
+
# args_valid_or_default destRootPackage '^.+$' "Destination root package" "${defaultDestRootPackage}"
|
|
308
|
+
# @SEE_ALSO
|
|
309
|
+
# args_valid_or_select, args_valid_or_select_args, args_valid_or_select_pipe, args_valid_or_read
|
|
310
|
+
function args_valid_or_default() {
|
|
311
|
+
local value regExp prompt defaultValue
|
|
312
|
+
value=$(eval eval "echo '$'$1")
|
|
313
|
+
regExp=${2}
|
|
314
|
+
prompt="${3}"
|
|
315
|
+
defaultValue="${4}"
|
|
316
|
+
|
|
317
|
+
if [[ -z "${value}" || ! ${value} =~ ${regExp} ]]; then
|
|
318
|
+
prompt="for param ${1}:"
|
|
319
|
+
[[ -n "${value}" ]] && prompt+=" the input '${value}' is not valid" || prompt+=" no input"
|
|
320
|
+
[[ -n "${defaultValue}" ]] && prompt+=", fallback to default value '${defaultValue}'" || prompt+=", fallback to empty"
|
|
321
|
+
print_warn "${prompt}"
|
|
322
|
+
value="${defaultValue}"
|
|
323
|
+
fi
|
|
324
|
+
eval "${1}='${value}'"
|
|
325
|
+
printf "Inputted value: ${COLOR_BLUE}'%s'${COLOR_END}\n" "$(eval echo '$'"${1}")"
|
|
326
|
+
}
|