@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 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
- # Generate default usage response for -h
51
+ onlyPositionalVarNames=()
52
+ descriptions=''
57
53
  if ((nbPositionalVarNames > 0)); then
58
- strPositionalVarNames=" $(array_join ' ' positionalVarNames)"
59
- strPositionalValuesExamples=" \"$(array_join 'Value" "' positionalVarNames)Value\""
60
- fi
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
- descriptions=''
63
- for element in "${positionalVarNames[@]}"; do
64
- validCommand="$(
65
- grep -E "^\s*args_valid.*\s+${element}\s+" "$0" | head -1 |
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
- prompt="$(reflect_nth_arg 4 "${validCommand}")"
92
- possibleValues=""
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
- prompt="$(
96
- echo "${prompt}" |
97
- string_replace "_SPACE_" " " |
98
- string_replace "_DOLLAR_" "$" |
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
@@ -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.1.0",
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.6",
2589
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
2590
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@renault-digital/bash-base",
3
- "version": "2.1.0",
3
+ "version": "2.3.2",
4
4
  "description": "A common lib for creating bash script easily.",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -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
@@ -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 64
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
- # Generate default usage response for -h
48
+ onlyPositionalVarNames=()
49
+ descriptions=''
54
50
  if ((nbPositionalVarNames > 0)); then
55
- strPositionalVarNames=" $(array_join ' ' positionalVarNames)"
56
- strPositionalValuesExamples=" \"$(array_join 'Value" "' positionalVarNames)Value\""
57
- fi
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
- descriptions=''
60
- for element in "${positionalVarNames[@]}"; do
61
- validCommand="$(
62
- grep -E "^\s*args_valid.*\s+${element}\s+" "$0" | head -1 |
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
- prompt="$(reflect_nth_arg 4 "${validCommand}")"
89
- possibleValues=""
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
- prompt="$(
93
- echo "${prompt}" |
94
- string_replace "_SPACE_" " " |
95
- string_replace "_DOLLAR_" "$" |
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
+ }