]>
Commit | Line | Data |
---|---|---|
cce855bc JA |
1 | # test the ksh-like extended globbing features: [!@*?+](patlist) |
2 | ||
3 | shopt -s extglob | |
4 | ||
5 | expect() | |
6 | { | |
7 | echo expect "$@" | |
8 | } | |
9 | ||
10 | case "/dev/udp/129.22.8.102/45" in | |
11 | /dev/@(tcp|udp)/*/*) echo ok 1;; | |
12 | *) echo bad 1;; | |
13 | esac | |
14 | ||
15 | # valid numbers | |
16 | case 12 in | |
17 | 0|[1-9]*([0-9])) echo ok 2;; | |
18 | *) echo bad 2;; | |
19 | esac | |
20 | ||
21 | case 12abc in | |
22 | 0|[1-9]*([0-9])) echo bad 3;; | |
23 | *) echo ok 3;; | |
24 | esac | |
25 | ||
26 | case 1 in | |
27 | 0|[1-9]*([0-9])) echo ok 4;; | |
28 | *) echo bad 4;; | |
29 | esac | |
30 | ||
31 | # octal numbers | |
32 | case 07 in | |
33 | +([0-7])) echo ok 5;; | |
34 | *) echo bad 5;; | |
35 | esac | |
36 | ||
37 | case 0377 in | |
38 | +([0-7])) echo ok 6;; | |
39 | *) echo bad 6;; | |
40 | esac | |
41 | ||
42 | case 09 in | |
43 | +([0-7])) echo bad 7;; | |
44 | *) echo ok 7;; | |
45 | esac | |
46 | ||
47 | # stuff from korn's book | |
48 | case paragraph in | |
49 | para@(chute|graph)) echo ok 8;; | |
50 | *) echo bad 8;; | |
51 | esac | |
52 | ||
53 | case paramour in | |
54 | para@(chute|graph)) echo bad 9;; | |
55 | *) echo ok 9;; | |
56 | esac | |
57 | ||
58 | case para991 in | |
59 | para?([345]|99)1) echo ok 10;; | |
60 | *) echo bad 10;; | |
61 | esac | |
62 | ||
63 | case para381 in | |
64 | para?([345]|99)1) echo bad 11;; | |
65 | *) echo ok 11;; | |
66 | esac | |
67 | ||
68 | case paragraph in | |
69 | para*([0-9])) echo bad 12;; | |
70 | *) echo ok 12;; | |
71 | esac | |
72 | ||
73 | case para in | |
74 | para*([0-9])) echo ok 13;; | |
75 | *) echo bad 13;; | |
76 | esac | |
77 | ||
78 | case para13829383746592 in | |
79 | para*([0-9])) echo ok 14;; | |
80 | *) echo bad 14;; | |
81 | esac | |
82 | ||
83 | case paragraph in | |
84 | para*([0-9])) echo bad 15;; | |
85 | *) echo ok 15;; | |
86 | esac | |
87 | ||
88 | case para in | |
89 | para+([0-9])) echo bad 16;; | |
90 | *) echo ok 16;; | |
91 | esac | |
92 | ||
93 | case para987346523 in | |
94 | para+([0-9])) echo ok 17;; | |
95 | *) echo bad 17;; | |
96 | esac | |
97 | ||
98 | case paragraph in | |
99 | para!(*.[0-9])) echo ok 18;; | |
100 | *) echo bad 18;; | |
101 | esac | |
102 | ||
103 | case para.38 in | |
104 | para!(*.[0-9])) echo ok 19;; | |
105 | *) echo bad 19;; | |
106 | esac | |
107 | ||
108 | case para.graph in | |
109 | para!(*.[0-9])) echo ok 20;; | |
110 | *) echo bad 20;; | |
111 | esac | |
112 | ||
113 | case para39 in | |
114 | para!(*.[0-9])) echo ok 21;; | |
115 | *) echo bad 21;; | |
116 | esac | |
117 | ||
118 | # tests derived from those in rosenblatt's korn shell book | |
119 | ||
120 | case "" in | |
121 | *(0|1|3|5|7|9)) echo ok 22;; | |
122 | *) echo bad 22; | |
123 | esac | |
124 | ||
125 | case 137577991 in | |
126 | *(0|1|3|5|7|9)) echo ok 23;; | |
127 | *) echo bad 23; | |
128 | esac | |
129 | ||
130 | case 2468 in | |
131 | *(0|1|3|5|7|9)) echo bad 24;; | |
132 | *) echo ok 24; | |
133 | esac | |
134 | ||
135 | case file.c in | |
136 | *.c?(c)) echo ok 25;; | |
137 | *) echo bad 25;; | |
138 | esac | |
139 | ||
140 | case file.C in | |
141 | *.c?(c)) echo bad 26;; | |
142 | *) echo ok 26;; | |
143 | esac | |
144 | ||
145 | case file.cc in | |
146 | *.c?(c)) echo ok 27;; | |
147 | *) echo bad 27;; | |
148 | esac | |
149 | ||
150 | case file.ccc in | |
151 | *.c?(c)) echo bad 28;; | |
152 | *) echo ok 28;; | |
153 | esac | |
154 | ||
155 | case parse.y in | |
156 | !(*.c|*.h|Makefile.in|config*|README)) echo ok 29;; | |
157 | *) echo bad 29;; | |
158 | esac | |
159 | ||
160 | case shell.c in | |
161 | !(*.c|*.h|Makefile.in|config*|README)) echo bad 30;; | |
162 | *) echo ok 30;; | |
163 | esac | |
164 | ||
165 | case Makefile in | |
166 | !(*.c|*.h|Makefile.in|config*|README)) echo ok 31;; | |
167 | *) echo bad 31;; | |
168 | esac | |
169 | ||
170 | case "VMS.FILE;1" in | |
171 | *\;[1-9]*([0-9])) echo ok 32;; | |
172 | *) echo bad 32;; | |
173 | esac | |
174 | ||
175 | case "VMS.FILE;0" in | |
176 | *\;[1-9]*([0-9])) echo bad 33;; | |
177 | *) echo ok 33;; | |
178 | esac | |
179 | case "VMS.FILE;" in | |
180 | *\;[1-9]*([0-9])) echo bad 34;; | |
181 | *) echo ok 34;; | |
182 | esac | |
183 | case "VMS.FILE;139" in | |
184 | *\;[1-9]*([0-9])) echo ok 35;; | |
185 | *) echo bad 35;; | |
186 | esac | |
187 | case "VMS.FILE;1N" in | |
188 | *\;[1-9]*([0-9])) echo bad 36;; | |
189 | *) echo ok 36;; | |
190 | esac | |
191 | ||
192 | # tests derived from the pd-ksh test suite | |
193 | ||
194 | MYDIR=$PWD # save where we are | |
195 | ||
0001803f CR |
196 | : ${TMPDIR:=/var/tmp} |
197 | TESTDIR=$TMPDIR/eglob-test-$$ | |
cce855bc JA |
198 | mkdir $TESTDIR |
199 | builtin cd $TESTDIR || { echo $0: cannot cd to $TESTDIR >&2 ; exit 1; } | |
200 | rm -rf * | |
201 | ||
202 | touch abcx abcz bbc | |
203 | expect '!([*)*' | |
204 | echo !([*)* | |
205 | ||
206 | expect '+(a|b[)*' | |
207 | echo +(a|b[)* | |
208 | ||
209 | expect '[a*(]*z' | |
210 | echo [a*(]*)z | |
211 | ||
212 | rm -f abcx abcz bbc | |
213 | ||
214 | touch abc | |
215 | ||
216 | expect '+()c' | |
217 | echo +()c | |
218 | expect '+()x' | |
219 | echo +()x | |
220 | expect abc | |
221 | echo +(*)c | |
222 | expect '+(*)x' | |
223 | echo +(*)x | |
224 | ||
225 | # extended globbing should not be performed on the output of substitutions | |
226 | x='@(*)' | |
227 | expect '@(*)' | |
228 | echo $x | |
229 | ||
230 | expect 'no-file+(a|b)stuff' | |
231 | echo no-file+(a|b)stuff | |
232 | expect 'no-file+(a*(c)|b)stuff' | |
233 | echo no-file+(a*(c)|b)stuff | |
234 | ||
235 | touch abd acd | |
236 | ||
237 | expect 'abd acd' | |
238 | echo a+(b|c)d | |
239 | ||
240 | expect 'acd' | |
241 | echo a!(@(b|B))d | |
242 | ||
243 | expect 'abd' | |
244 | echo a[b*(foo|bar)]d | |
245 | ||
246 | # simple kleene star tests | |
247 | expect no | |
248 | case foo in *(a|b[)) echo yes;; *) echo no;; esac | |
249 | ||
250 | expect yes | |
251 | case foo in *(a|b[)|f*) echo yes;; *) echo no;; esac | |
252 | ||
253 | # this doesn't work right yet; it is an incorrectly formed pattern | |
254 | expect yes | |
255 | case '*(a|b[)' in *(a|b[)) echo yes;; *) echo no;; esac | |
256 | ||
257 | # check extended globbing in pattern removal -- these don't work right yet | |
258 | x=abcdef | |
259 | ||
260 | expect '1: bcdef' | |
261 | echo 1: ${x#+(a|abc)} | |
262 | expect '2: def' | |
263 | echo 2: ${x##+(a|abc)} | |
264 | expect '3: abcde' | |
265 | echo 3: ${x%+(def|f)} | |
266 | expect '4: abc' | |
267 | echo 4: ${x%%+(f|def)} | |
268 | ||
269 | # these work ok | |
270 | ||
271 | expect '5: ef' | |
272 | echo 5: ${x#*(a|b)cd} | |
273 | expect '6: ef' | |
274 | echo 6: "${x#*(a|b)cd}" | |
275 | expect '7: abcdef' | |
276 | echo 7: ${x#"*(a|b)cd"} | |
277 | ||
b72432fd JA |
278 | # More tests derived from a bug report concerning extended glob patterns |
279 | # following a * | |
280 | builtin cd $TESTDIR || { echo $0: cannot cd to $TESTDIR >&2 ; exit 1; } | |
281 | rm -rf * | |
282 | ||
283 | touch ab abcdef abef abcfef | |
284 | ||
285 | expect 'ab abef' | |
286 | echo ab*(e|f) | |
287 | ||
288 | expect 'abcfef abef' | |
289 | echo ab?*(e|f) | |
290 | ||
291 | expect abcdef | |
292 | echo ab*d+(e|f) | |
293 | ||
294 | expect 'ab abcdef abcfef abef' | |
295 | echo ab**(e|f) | |
296 | ||
297 | expect 'abcdef abcfef abef' | |
298 | echo ab*+(e|f) | |
299 | ||
300 | case 'abcfefg' in | |
301 | ab**(e|f)) echo ok 37;; | |
302 | *) echo bad 37;; | |
303 | esac | |
304 | ||
305 | case 'abcfefg' in | |
306 | ab**(e|f)g) echo ok 38;; | |
307 | *a) echo bad 38;; | |
308 | esac | |
309 | ||
310 | case ab in | |
311 | ab*+(e|f)) echo bad 39;; | |
312 | *) echo ok 39;; | |
313 | esac | |
314 | ||
315 | case abef in | |
316 | ab***ef) echo ok 40;; | |
317 | *) echo bad 40;; | |
318 | esac | |
319 | ||
320 | case abef in | |
321 | ab**) echo ok 41;; | |
322 | *) echo bad 41;; | |
323 | esac | |
324 | ||
b80f6443 JA |
325 | # bug in all versions up to and including bash-2.05b |
326 | case "123abc" in | |
327 | *?(a)bc) echo ok 42;; | |
328 | *) echo bad 42;; | |
329 | esac | |
330 | ||
b72432fd JA |
331 | # clean up and do the next one |
332 | ||
333 | builtin cd / | |
334 | rm -rf $TESTDIR | |
335 | ||
336 | mkdir $TESTDIR | |
337 | builtin cd $TESTDIR | |
338 | ||
bb70624e | 339 | LC_COLLATE=C # have to set this; it affects the sorting |
b72432fd JA |
340 | touch a.b a,b a:b a-b a\;b a\ b a_b |
341 | ||
342 | echo a[^[:alnum:]]b | |
343 | echo a[-.,:\;\ _]b | |
344 | ||
345 | echo a@([^[:alnum:]])b | |
346 | echo a@([-.,:; _])b | |
347 | echo a@([.])b | |
348 | echo a@([^.])b | |
349 | echo a@([^x])b | |
350 | echo a+([^[:alnum:]])b | |
351 | ||
352 | echo a@(.|[^[:alnum:]])b | |
cce855bc JA |
353 | |
354 | builtin cd / | |
355 | rm -rf $TESTDIR | |
356 | ||
95732b49 JA |
357 | x=abcdef |
358 | recho "${x#*(a|b)cd}" | |
359 | ||
3185942a JA |
360 | TEST='a , b' |
361 | shopt -s globstar | |
362 | echo ${TEST//*([[:space:]]),*([[:space:]])/,} | |
363 | shopt -u globstar | |
364 | ||
cce855bc JA |
365 | # this is for the benefit of pure coverage, so it writes the pcv file |
366 | # in the right place | |
3185942a | 367 | builtin cd "$MYDIR" |
cce855bc | 368 | |
0628567a JA |
369 | ${THIS_SH} ./extglob1.sub |
370 | ||
ac50fbac CR |
371 | ${THIS_SH} ./extglob1a.sub |
372 | ||
cce855bc | 373 | exit 0 |