1 |
# |
2 |
# Test matching with case |
3 |
# |
4 |
# Usage: |
5 |
# ./extglob-match.test.sh <function name> |
6 |
|
7 |
#### @ matches exactly one |
8 |
shopt -s extglob # needed for Oil, not bash |
9 |
[[ --verbose == --@(help|verbose) ]] && echo TRUE |
10 |
[[ --oops == --@(help|verbose) ]] || echo FALSE |
11 |
## STDOUT: |
12 |
TRUE |
13 |
FALSE |
14 |
## END |
15 |
|
16 |
#### @() with variable arms |
17 |
shopt -s extglob # needed for Oil, not bash |
18 |
choice1='help' |
19 |
choice2='verbose' |
20 |
[[ --verbose == --@($choice1|$choice2) ]] && echo TRUE |
21 |
[[ --oops == --@($choice1|$choice2) ]] || echo FALSE |
22 |
## STDOUT: |
23 |
TRUE |
24 |
FALSE |
25 |
## END |
26 |
|
27 |
#### extglob in variable |
28 |
shopt -s extglob |
29 |
g=--@(help|verbose) # this syntax requires extglob in bash!! |
30 |
quoted='--@(help|verbose)' |
31 |
[[ --help == $g ]] && echo TRUE |
32 |
[[ --verbose == $g ]] && echo TRUE |
33 |
[[ -- == $g ]] || echo FALSE |
34 |
[[ --help == $q ]] || echo FALSE |
35 |
[[ -- == $q ]] || echo FALSE |
36 |
## STDOUT: |
37 |
TRUE |
38 |
TRUE |
39 |
FALSE |
40 |
FALSE |
41 |
FALSE |
42 |
## END |
43 |
## N-I mksh STDOUT: |
44 |
FALSE |
45 |
FALSE |
46 |
FALSE |
47 |
## END |
48 |
|
49 |
#### nested @() |
50 |
shopt -s extglob |
51 |
pat='--@(help|verbose|no-@(long|short)-option)' |
52 |
[[ --no-long-option == $pat ]] && echo TRUE |
53 |
[[ --no-short-option == $pat ]] && echo TRUE |
54 |
[[ --help == $pat ]] && echo TRUE |
55 |
[[ --oops == $pat ]] || echo FALSE |
56 |
## STDOUT: |
57 |
TRUE |
58 |
TRUE |
59 |
TRUE |
60 |
FALSE |
61 |
## END |
62 |
## BUG mksh STDOUT: |
63 |
FALSE |
64 |
## END |
65 |
|
66 |
#### nested @() with quotes and vars |
67 |
shopt -s extglob |
68 |
prefix=no |
69 |
[[ --no-long-option == --@(help|verbose|$prefix-@(long|short)-'option') ]] && |
70 |
echo TRUE |
71 |
## STDOUT: |
72 |
TRUE |
73 |
## END |
74 |
|
75 |
#### ? matches 0 or 1 |
76 |
shopt -s extglob # needed for Oil, not bash |
77 |
[[ -- == --?(help|verbose) ]] && echo TRUE |
78 |
[[ --oops == --?(help|verbose) ]] || echo FALSE |
79 |
## STDOUT: |
80 |
TRUE |
81 |
FALSE |
82 |
## END |
83 |
|
84 |
#### + matches 1 or more |
85 |
shopt -s extglob # needed for Oil, not bash |
86 |
[[ --helphelp == --+(help|verbose) ]] && echo TRUE |
87 |
[[ -- == --+(help|verbose) ]] || echo FALSE |
88 |
## STDOUT: |
89 |
TRUE |
90 |
FALSE |
91 |
## END |
92 |
|
93 |
#### * matches 0 or more |
94 |
shopt -s extglob # needed for Oil, not bash |
95 |
[[ -- == --*(help|verbose) ]] && echo TRUE |
96 |
[[ --oops == --*(help|verbose) ]] || echo FALSE |
97 |
## STDOUT: |
98 |
TRUE |
99 |
FALSE |
100 |
## END |
101 |
|
102 |
#### simple repetition with *(foo) and +(Foo) |
103 |
shopt -s extglob # needed for Oil, not bash |
104 |
[[ foofoo == *(foo) ]] && echo TRUE |
105 |
[[ foofoo == +(foo) ]] && echo TRUE |
106 |
## STDOUT: |
107 |
TRUE |
108 |
TRUE |
109 |
## END |
110 |
|
111 |
#### ! matches none |
112 |
shopt -s extglob # needed for Oil, not bash |
113 |
[[ --oops == --!(help|verbose) ]] && echo TRUE |
114 |
[[ --help == --!(help|verbose) ]] || echo FALSE |
115 |
## STDOUT: |
116 |
TRUE |
117 |
FALSE |
118 |
## END |
119 |
|
120 |
#### match is anchored |
121 |
shopt -s extglob # needed for Oil, not bash |
122 |
[[ foo_ == @(foo) ]] || echo FALSE |
123 |
[[ _foo == @(foo) ]] || echo FALSE |
124 |
[[ foo == @(foo) ]] && echo TRUE |
125 |
## STDOUT: |
126 |
FALSE |
127 |
FALSE |
128 |
TRUE |
129 |
## END |
130 |
|
131 |
#### repeated match is anchored |
132 |
shopt -s extglob # needed for Oil, not bash |
133 |
[[ foofoo_ == +(foo) ]] || echo FALSE |
134 |
[[ _foofoo == +(foo) ]] || echo FALSE |
135 |
[[ foofoo == +(foo) ]] && echo TRUE |
136 |
## STDOUT: |
137 |
FALSE |
138 |
FALSE |
139 |
TRUE |
140 |
## END |
141 |
|
142 |
#### repetition with glob |
143 |
shopt -s extglob # needed for Oil, not bash |
144 |
|
145 |
# NOTE that * means two different things here |
146 |
[[ foofoo_foo__foo___ == *(foo*) ]] && echo TRUE |
147 |
[[ Xoofoo_foo__foo___ == *(foo*) ]] || echo FALSE |
148 |
## STDOUT: |
149 |
TRUE |
150 |
FALSE |
151 |
## END |
152 |
|
153 |
#### No brace expansion in == |
154 |
shopt -s extglob # needed for Oil, not bash |
155 |
|
156 |
[[ --X{a,b}X == --@(help|X{a,b}X) ]] && echo TRUE |
157 |
[[ --oops == --@(help|X{a,b}X) ]] || echo FALSE |
158 |
## STDOUT: |
159 |
TRUE |
160 |
FALSE |
161 |
## END |
162 |
|
163 |
#### adjacent extglob |
164 |
shopt -s extglob # needed for Oil, not bash |
165 |
|
166 |
[[ --help == @(--|++)@(help|verbose) ]] && echo TRUE |
167 |
[[ ++verbose == @(--|++)@(help|verbose) ]] && echo TRUE |
168 |
## STDOUT: |
169 |
TRUE |
170 |
TRUE |
171 |
## END |
172 |
|
173 |
#### nested extglob |
174 |
shopt -s extglob # needed for Oil, not bash |
175 |
|
176 |
[[ --help == --@(help|verbose=@(1|2)) ]] && echo TRUE |
177 |
[[ --verbose=1 == --@(help|verbose=@(1|2)) ]] && echo TRUE |
178 |
[[ --verbose=2 == --@(help|verbose=@(1|2)) ]] && echo TRUE |
179 |
[[ --verbose == --@(help|verbose=@(1|2)) ]] || echo FALSE |
180 |
## STDOUT: |
181 |
TRUE |
182 |
TRUE |
183 |
TRUE |
184 |
FALSE |
185 |
## END |
186 |
|
187 |
#### extglob empty string |
188 |
shopt -s extglob |
189 |
[[ '' == @(foo|bar) ]] || echo FALSE |
190 |
[[ '' == @(foo||bar) ]] && echo TRUE |
191 |
## STDOUT: |
192 |
FALSE |
193 |
TRUE |
194 |
## END |
195 |
|
196 |
#### extglob empty pattern |
197 |
shopt -s extglob |
198 |
[[ '' == @() ]] && echo TRUE |
199 |
[[ '' == @(||) ]] && echo TRUE |
200 |
[[ X == @() ]] || echo FALSE |
201 |
[[ '|' == @(||) ]] || echo FALSE |
202 |
## STDOUT: |
203 |
TRUE |
204 |
TRUE |
205 |
FALSE |
206 |
FALSE |
207 |
## END |
208 |
|
209 |
#### case with extglob |
210 |
shopt -s extglob |
211 |
for word in --help --verbose --unmatched -- -zxzx -; do |
212 |
case $word in |
213 |
--@(help|verbose) ) |
214 |
echo A |
215 |
continue |
216 |
;; |
217 |
( --?(b|c) ) |
218 |
echo B |
219 |
continue |
220 |
;; |
221 |
( -+(x|z) ) |
222 |
echo C |
223 |
continue |
224 |
;; |
225 |
( -*(x|z) ) |
226 |
echo D |
227 |
continue |
228 |
;; |
229 |
*) |
230 |
echo U |
231 |
continue |
232 |
;; |
233 |
esac |
234 |
done |
235 |
## STDOUT: |
236 |
A |
237 |
A |
238 |
U |
239 |
B |
240 |
C |
241 |
D |
242 |
## END |
243 |
|
244 |
#### [[ $x == !($str) ]] |
245 |
shopt -s extglob |
246 |
empty='' |
247 |
str='x' |
248 |
[[ $empty == !($str) ]] && echo TRUE # test glob match |
249 |
[[ $str == !($str) ]] || echo FALSE |
250 |
## STDOUT: |
251 |
TRUE |
252 |
FALSE |
253 |
## END |
254 |
|
255 |
#### Turning extglob on changes the meaning of [[ !(str) ]] in bash |
256 |
empty='' |
257 |
str='x' |
258 |
[[ !($empty) ]] && echo TRUE # test if $empty is empty |
259 |
[[ !($str) ]] || echo FALSE # test if $str is empty |
260 |
shopt -s extglob # mksh doesn't have this |
261 |
[[ !($empty) ]] && echo TRUE # negated glob |
262 |
[[ !($str) ]] && echo TRUE # negated glob |
263 |
## STDOUT: |
264 |
TRUE |
265 |
FALSE |
266 |
TRUE |
267 |
TRUE |
268 |
## END |
269 |
## OK osh/mksh STDOUT: |
270 |
TRUE |
271 |
TRUE |
272 |
TRUE |
273 |
## END |
274 |
|
275 |
#### With extglob on, !($str) on the left or right of == has different meanings |
276 |
shopt -s extglob |
277 |
empty='' |
278 |
str='x' |
279 |
[[ 1 == !($str) ]] && echo TRUE # glob match |
280 |
[[ !($str) == 1 ]] || echo FALSE # test if empty |
281 |
# NOTE: There cannot be a space between ! and (? |
282 |
## STDOUT: |
283 |
TRUE |
284 |
FALSE |
285 |
## END |
286 |
|
287 |
#### extglob inside arg word |
288 |
shopt -s extglob |
289 |
[[ foo == @(foo|bar) ]] && echo TRUE |
290 |
[[ foo == ${unset:-@(foo|bar)} ]] && echo TRUE |
291 |
[[ fo == ${unset:-@(foo|bar)} ]] || echo FALSE |
292 |
## STDOUT: |
293 |
TRUE |
294 |
TRUE |
295 |
FALSE |
296 |
## END |
297 |
## BUG mksh STDOUT: |
298 |
TRUE |
299 |
FALSE |
300 |
## END |
301 |
|
302 |
#### extglob is not detected in regex! |
303 |
shopt -s extglob |
304 |
[[ foo =~ ^@(foo|bar)$ ]] || echo FALSE |
305 |
## STDOUT: |
306 |
FALSE |
307 |
## END |
308 |
## N-I mksh stdout-json: "" |
309 |
## N-I mksh status: 1 |
310 |
|
311 |
|
312 |
#### regular glob of single unicode char |
313 |
shopt -s extglob |
314 |
[[ __a__ == __?__ ]] |
315 |
echo $? |
316 |
[[ __μ__ == __?__ ]] |
317 |
echo $? |
318 |
## STDOUT: |
319 |
0 |
320 |
0 |
321 |
## END |
322 |
## BUG mksh STDOUT: |
323 |
0 |
324 |
1 |
325 |
## END |
326 |
|
327 |
#### extended glob of single unicode char |
328 |
shopt -s extglob |
329 |
[[ __a__ == @(__?__) ]] |
330 |
echo $? |
331 |
[[ __μ__ == @(__?__) ]] |
332 |
echo $? |
333 |
## STDOUT: |
334 |
0 |
335 |
0 |
336 |
## END |
337 |
## BUG mksh STDOUT: |
338 |
0 |
339 |
1 |
340 |
## END |