]>
Commit | Line | Data |
---|---|---|
8868edaf CR |
1 | # This program is free software: you can redistribute it and/or modify |
2 | # it under the terms of the GNU General Public License as published by | |
3 | # the Free Software Foundation, either version 3 of the License, or | |
4 | # (at your option) any later version. | |
5 | # | |
6 | # This program is distributed in the hope that it will be useful, | |
7 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
8 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
9 | # GNU General Public License for more details. | |
10 | # | |
11 | # You should have received a copy of the GNU General Public License | |
12 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
13 | # | |
495aee44 CR |
14 | export LC_COLLATE=C |
15 | # | |
16 | # test the shell globbing | |
17 | # | |
18 | expect() | |
19 | { | |
d233b485 | 20 | : # if needed, change me to echo expect "$@" |
495aee44 CR |
21 | } |
22 | ||
23 | # First, a test that bash-2.01.1 fails | |
24 | ${THIS_SH} ./glob1.sub | |
d233b485 CR |
25 | ${THIS_SH} ./glob2.sub |
26 | ${THIS_SH} ./glob3.sub | |
27 | ${THIS_SH} ./glob4.sub | |
8868edaf CR |
28 | ${THIS_SH} ./glob5.sub |
29 | ${THIS_SH} ./glob6.sub | |
30 | ${THIS_SH} ./glob7.sub | |
31 | ${THIS_SH} ./glob8.sub | |
32 | ${THIS_SH} ./glob9.sub | |
495aee44 CR |
33 | |
34 | MYDIR=$PWD # save where we are | |
35 | ||
d233b485 | 36 | TESTDIR=$TMPDIR/glob-test-$$ |
495aee44 CR |
37 | mkdir $TESTDIR |
38 | builtin cd $TESTDIR || { echo $0: cannot cd to $TESTDIR >&2 ; exit 1; } | |
39 | rm -rf * | |
40 | ||
41 | touch a b c d abc abd abe bb bcd ca cb dd de Beware | |
42 | mkdir bdir | |
43 | ||
44 | # see if `regular' globbing works right | |
45 | expect '<a> <abc> <abd> <abe> <X*>' | |
46 | recho a* X* | |
47 | ||
48 | expect '<a> <abc> <abd> <abe>' | |
49 | recho \a* | |
50 | ||
51 | # see if null glob expansion works | |
52 | shopt -s nullglob | |
53 | ||
54 | expect '<a> <abc> <abd> <abe>' | |
55 | recho a* X* | |
56 | ||
57 | shopt -u nullglob | |
58 | ||
59 | # see if the failglob option works | |
60 | ||
61 | mkdir tmp | |
62 | touch tmp/l1 tmp/l2 tmp/l3 | |
63 | builtin echo tmp/l[12] tmp/*4 tmp/*3 | |
64 | shopt -s failglob | |
65 | builtin echo tmp/l[12] tmp/*4 tmp/*3 | |
66 | rm -r tmp | |
67 | shopt -u failglob | |
68 | ||
69 | # see if the code that expands directories only works | |
70 | expect '<bdir/>' | |
71 | recho b*/ | |
72 | ||
73 | # Test quoted and unquoted globbing characters | |
74 | expect '<*>' | |
75 | recho \* | |
76 | ||
77 | expect '<a*>' | |
78 | recho 'a*' | |
79 | ||
80 | expect '<a*>' | |
81 | recho a\* | |
82 | ||
83 | expect '<c> <ca> <cb> <a*> <*q*>' | |
84 | recho c* a\* *q* | |
85 | ||
86 | expect '<**>' | |
87 | recho "*"* | |
88 | ||
89 | expect '<**>' | |
90 | recho \** | |
91 | ||
92 | expect '<\.\./*/>' | |
93 | recho "\.\./*/" | |
94 | ||
95 | expect '<s/\..*//>' | |
96 | recho 's/\..*//' | |
97 | ||
98 | # Pattern from Larry Wall's Configure that caused bash to blow up | |
99 | expect '</^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/>' | |
100 | recho "/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*"'$'"/\1/" | |
101 | ||
102 | # Make sure character classes work properly | |
103 | ||
104 | expect '<abc> <abd> <abe> <bb> <cb>' | |
105 | recho [a-c]b* | |
106 | ||
107 | expect '<abd> <abe> <bb> <bcd> <bdir> <ca> <cb> <dd> <de>' | |
108 | recho [a-y]*[^c] | |
109 | ||
110 | expect '<abd> <abe>' | |
111 | recho a*[^c] | |
112 | ||
113 | touch a-b aXb | |
114 | expect '<a-b> <aXb>' | |
115 | recho a[X-]b | |
116 | ||
117 | touch .x .y | |
118 | expect '<Beware> <d> <dd> <de>' | |
119 | recho [^a-c]* | |
120 | ||
121 | # Make sure that filenames with embedded globbing characters are handled | |
122 | # properly | |
123 | mkdir a\*b | |
124 | > a\*b/ooo | |
125 | ||
126 | expect '<a*b/ooo>' | |
127 | recho a\*b/* | |
128 | ||
129 | expect '<a*b/ooo>' | |
130 | recho a\*?/* | |
131 | ||
132 | expect '<no match>' | |
133 | cmd='echo !7' | |
134 | case "$cmd" in | |
135 | *\\!*) echo match ;; | |
136 | *) echo no match ;; | |
137 | esac | |
138 | ||
139 | expect '<not there>' | |
140 | file='r.*' | |
141 | case $file in | |
142 | *.\*) echo not there ;; | |
143 | *) echo there ;; | |
144 | esac | |
145 | ||
146 | # examples from the Posix.2 spec (d11.2, p. 243) | |
147 | expect '<abc>' | |
148 | recho a[b]c | |
149 | ||
150 | expect '<abc>' | |
151 | recho a["b"]c | |
152 | ||
153 | expect '<abc>' | |
154 | recho a[\b]c | |
155 | ||
156 | expect '<abc>' | |
157 | recho a?c | |
158 | ||
159 | expect '<match 1>' | |
160 | case abc in | |
161 | a"b"c) echo 'match 1' ;; | |
162 | *) echo 'BAD match 1' ;; | |
163 | esac | |
164 | ||
165 | expect '<match 2>' | |
166 | case abc in | |
167 | a*c) echo 'match 2' ;; | |
168 | *) echo 'BAD match 2' ;; | |
169 | esac | |
170 | ||
171 | expect '<ok 1>' | |
172 | case abc in | |
173 | "a?c") echo 'bad 1' ;; | |
174 | *) echo 'ok 1' ;; | |
175 | esac | |
176 | ||
177 | expect '<ok 2>' | |
178 | case abc in | |
179 | a\*c) echo 'bad 2' ;; | |
180 | *) echo 'ok 2' ;; | |
181 | esac | |
182 | ||
183 | expect '<ok 3>' | |
184 | case abc in | |
185 | a\[b]c) echo 'bad 3' ;; | |
186 | *) echo 'ok 3' ;; | |
187 | esac | |
188 | ||
189 | expect '<ok 4>' | |
190 | case "$nosuchvar" in | |
191 | "") echo 'ok 4' ;; | |
192 | *) echo 'bad 4' ;; | |
193 | esac | |
194 | ||
195 | # This is very odd, but sh and ksh seem to agree | |
196 | expect '<ok 5>' | |
197 | case abc in | |
198 | a["\b"]c) echo 'ok 5' ;; | |
199 | *) echo 'bad 5' ;; | |
200 | esac | |
201 | ||
202 | mkdir man | |
203 | mkdir man/man1 | |
204 | touch man/man1/bash.1 | |
205 | expect '<man/man1/bash.1>' | |
206 | recho */man*/bash.* | |
207 | expect '<man/man1/bash.1>' | |
208 | recho $(echo */man*/bash.*) | |
209 | expect '<man/man1/bash.1>' | |
210 | recho "$(echo */man*/bash.*)" | |
211 | ||
212 | # tests with multiple `*'s | |
213 | case abc in | |
214 | a***c) echo ok 1;; | |
215 | esac | |
216 | ||
217 | case abc in | |
218 | a*****?c) echo ok 2;; | |
219 | esac | |
220 | ||
221 | case abc in | |
222 | ?*****??) echo ok 3;; | |
223 | esac | |
224 | ||
225 | case abc in | |
226 | *****??) echo ok 4;; | |
227 | esac | |
228 | ||
229 | case abc in | |
230 | *****??c) echo ok 5;; | |
231 | esac | |
232 | ||
233 | case abc in | |
234 | ?*****?c) echo ok 6;; | |
235 | esac | |
236 | ||
237 | case abc in | |
238 | ?***?****c) echo ok 7;; | |
239 | esac | |
240 | ||
241 | case abc in | |
242 | ?***?****?) echo ok 8;; | |
243 | esac | |
244 | ||
245 | case abc in | |
246 | ?***?****) echo ok 9;; | |
247 | esac | |
248 | ||
249 | case abc in | |
250 | *******c) echo ok 10;; | |
251 | esac | |
252 | ||
253 | case abc in | |
254 | *******?) echo ok 11;; | |
255 | esac | |
256 | ||
257 | case abcdecdhjk in | |
258 | a*cd**?**??k) echo ok 20;; | |
259 | esac | |
260 | ||
261 | case abcdecdhjk in | |
262 | a**?**cd**?**??k) echo ok 21;; | |
263 | esac | |
264 | ||
265 | case abcdecdhjk in | |
266 | a**?**cd**?**??k***) echo ok 22;; | |
267 | esac | |
268 | ||
269 | case abcdecdhjk in | |
270 | a**?**cd**?**??***k) echo ok 23;; | |
271 | esac | |
272 | ||
273 | case abcdecdhjk in | |
274 | a**?**cd**?**??***k**) echo ok 24;; | |
275 | esac | |
276 | ||
277 | case abcdecdhjk in | |
278 | a****c**?**??*****) echo ok 25;; | |
279 | esac | |
280 | ||
281 | case '-' in | |
282 | [-abc]) echo ok 26 ;; | |
283 | esac | |
284 | ||
285 | case '-' in | |
286 | [abc-]) echo ok 27 ;; | |
287 | esac | |
288 | ||
289 | case '\' in | |
290 | \\) echo ok 28 ;; | |
291 | esac | |
292 | ||
293 | case '\' in | |
294 | [\\]) echo ok 29 ;; | |
295 | esac | |
296 | ||
297 | case '\' in | |
298 | '\') echo ok 30 ;; | |
299 | esac | |
300 | ||
301 | case '[' in | |
302 | [[]) echo ok 31 ;; | |
303 | esac | |
304 | ||
305 | # a `[' without a closing `]' is just another character to match, in the | |
306 | # bash implementation | |
307 | case '[' in | |
308 | [) echo ok 32 ;; | |
309 | esac | |
310 | ||
311 | case '[abc' in | |
312 | [*) echo 'ok 33';; | |
313 | esac | |
314 | ||
315 | # a right bracket shall lose its special meaning and represent itself in | |
316 | # a bracket expression if it occurs first in the list. -- POSIX.2 2.8.3.2 | |
317 | case ']' in | |
318 | []]) echo ok 34 ;; | |
319 | esac | |
320 | ||
321 | case '-' in | |
322 | []-]) echo ok 35 ;; | |
323 | esac | |
324 | ||
325 | # a backslash should just escape the next character in this context | |
326 | case p in | |
327 | [a-\z]) echo ok 36 ;; | |
328 | esac | |
329 | ||
330 | # this was a bug in all versions up to bash-2.04-release | |
331 | case "/tmp" in | |
332 | [/\\]*) echo ok 37 ;; | |
333 | esac | |
334 | ||
335 | # none of these should output anything | |
336 | ||
337 | case abc in | |
338 | ??**********?****?) echo bad 1;; | |
339 | esac | |
340 | ||
341 | case abc in | |
342 | ??**********?****c) echo bad 2;; | |
343 | esac | |
344 | ||
345 | case abc in | |
346 | ?************c****?****) echo bad 3;; | |
347 | esac | |
348 | ||
349 | case abc in | |
350 | *c*?**) echo bad 4;; | |
351 | esac | |
352 | ||
353 | case abc in | |
354 | a*****c*?**) echo bad 5;; | |
355 | esac | |
356 | ||
357 | case abc in | |
358 | a********???*******) echo bad 6;; | |
359 | esac | |
360 | ||
361 | case 'a' in | |
362 | []) echo bad 7 ;; | |
363 | esac | |
364 | ||
365 | case '[' in | |
366 | [abc) echo bad 8;; | |
367 | esac | |
368 | ||
369 | # let's start testing the case-insensitive globbing code | |
370 | recho b* | |
371 | ||
372 | shopt -s nocaseglob | |
373 | recho b* | |
374 | ||
375 | recho [b]* | |
376 | shopt -u nocaseglob | |
377 | ||
378 | # make sure set -f works right | |
379 | set -f | |
380 | recho * | |
381 | set +f | |
382 | ||
383 | # test out the GLOBIGNORE code | |
384 | GLOBIGNORE='.*:*c:*e:?' | |
385 | recho * | |
386 | ||
387 | GLOBIGNORE='.*:*b:*d:?' | |
388 | recho * | |
389 | ||
390 | # see if GLOBIGNORE can substitute for `set -f' | |
391 | GLOBIGNORE='.*:*' | |
392 | recho * | |
393 | ||
394 | unset GLOBIGNORE | |
395 | expect '<man/man1/bash.1>' | |
396 | recho */man*/bash.* | |
397 | ||
398 | # make sure null values for GLOBIGNORE have no effect | |
399 | GLOBIGNORE= | |
400 | expect '<man/man1/bash.1>' | |
401 | recho */man*/bash.* | |
402 | ||
403 | # this is for the benefit of pure coverage, so it writes the pcv file | |
404 | # in the right place, and for gprof | |
405 | builtin cd $MYDIR | |
406 | ||
407 | rm -rf $TESTDIR | |
408 | ||
409 | exit 0 |