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