1 | # A test suite for the POSIX.2 (BRE) pattern matching code
|
---|
2 | LC_ALL=C
|
---|
3 | LANG=C
|
---|
4 |
|
---|
5 | # First, test POSIX.2 character classes
|
---|
6 |
|
---|
7 | case e in
|
---|
8 | [[:xdigit:]]) echo ok 1;;
|
---|
9 | esac
|
---|
10 |
|
---|
11 | case a in
|
---|
12 | [[:alpha:]123]) echo ok 2;;
|
---|
13 | esac
|
---|
14 |
|
---|
15 | case 1 in
|
---|
16 | [[:alpha:]123]) echo ok 3;;
|
---|
17 | esac
|
---|
18 |
|
---|
19 | case 9 in
|
---|
20 | [![:alpha:]]) echo ok 4;;
|
---|
21 | esac
|
---|
22 |
|
---|
23 | # invalid character class expressions are just characters to be matched
|
---|
24 | case a in
|
---|
25 | [:al:]) echo ok 5;;
|
---|
26 | esac
|
---|
27 |
|
---|
28 | case a in
|
---|
29 | [[:al:]) echo ok 6;;
|
---|
30 | esac
|
---|
31 |
|
---|
32 | case '!' in
|
---|
33 | [abc[:punct:][0-9]) echo ok 7;;
|
---|
34 | esac
|
---|
35 |
|
---|
36 | # let's try to match the start of a valid sh identifier
|
---|
37 | case 'PATH' in
|
---|
38 | [_[:alpha:]]*) echo ok 8;;
|
---|
39 | esac
|
---|
40 |
|
---|
41 | # let's try to match the first two characters of a valid sh identifier
|
---|
42 | case PATH in
|
---|
43 | [_[:alpha:]][_[:alnum:]]*) echo ok 9;;
|
---|
44 | esac
|
---|
45 |
|
---|
46 | # is ^C a cntrl character?
|
---|
47 | case $'\003' in
|
---|
48 | [[:cntrl:]]) echo ok 10;;
|
---|
49 | esac
|
---|
50 |
|
---|
51 | # how about A?
|
---|
52 | case A in
|
---|
53 | [[:cntrl:]]) echo oops -- cntrl ;;
|
---|
54 | *) echo ok 11;;
|
---|
55 | esac
|
---|
56 |
|
---|
57 | case 9 in
|
---|
58 | [[:digit:]]) echo ok 12;;
|
---|
59 | esac
|
---|
60 |
|
---|
61 | case X in
|
---|
62 | [[:digit:]]) echo oops -- digit;;
|
---|
63 | *) echo ok 13;;
|
---|
64 | esac
|
---|
65 |
|
---|
66 | case $'\033' in
|
---|
67 | [[:graph:]]) echo oops -- graph;;
|
---|
68 | *) echo ok 14;;
|
---|
69 | esac
|
---|
70 |
|
---|
71 | case $'\040' in
|
---|
72 | [[:graph:]]) echo oops -- graph 2;;
|
---|
73 | *) echo ok 15;;
|
---|
74 | esac
|
---|
75 |
|
---|
76 | case ' ' in
|
---|
77 | [[:graph:]]) echo oops -- graph 3;;
|
---|
78 | *) echo ok 16;;
|
---|
79 | esac
|
---|
80 |
|
---|
81 | case 'aB' in
|
---|
82 | [[:lower:]][[:upper:]]) echo ok 17;;
|
---|
83 | esac
|
---|
84 |
|
---|
85 | case $'\040' in
|
---|
86 | [[:print:]]) echo ok 18;;
|
---|
87 | *) echo oops -- print;;
|
---|
88 | esac
|
---|
89 |
|
---|
90 | case PS3 in
|
---|
91 | [_[:alpha:]][_[:alnum:]][_[:alnum:]]*) echo ok 19;;
|
---|
92 | esac
|
---|
93 |
|
---|
94 | case a in
|
---|
95 | [[:alpha:][:digit:]]) echo ok 20;;
|
---|
96 | *) echo oops - skip brackpat ;;
|
---|
97 | esac
|
---|
98 |
|
---|
99 | case a in
|
---|
100 | [[:alpha:]\]) echo oops -- dangling backslash in brackpat ;;
|
---|
101 | *) echo ok 21 ;;
|
---|
102 | esac
|
---|
103 |
|
---|
104 | # what's a newline? is it a blank? a space?
|
---|
105 | case $'\n' in
|
---|
106 | [[:blank:]]) echo ok -- blank ;;
|
---|
107 | [[:space:]]) echo ok -- space ;;
|
---|
108 | *) echo oops newline ;;
|
---|
109 | esac
|
---|
110 |
|
---|
111 | # OK, what's a tab? is it a blank? a space?
|
---|
112 | case $'\t' in
|
---|
113 | [[:blank:]]) echo ok -- blank ;;
|
---|
114 | [[:space:]]) echo ok -- space ;;
|
---|
115 | *) echo oops newline ;;
|
---|
116 | esac
|
---|
117 |
|
---|
118 | # let's check out characters in the ASCII range
|
---|
119 | case $'\377' in
|
---|
120 | [[:ascii:]]) echo oops -- ascii\?;;
|
---|
121 | esac
|
---|
122 |
|
---|
123 | case 9 in
|
---|
124 | [1[:alpha:]123]) echo oops 1;;
|
---|
125 | esac
|
---|
126 |
|
---|
127 | # however, an unterminated brace expression containing a valid char class
|
---|
128 | # that matches had better fail
|
---|
129 | case a in
|
---|
130 | [[:alpha:]) echo oops 2;;
|
---|
131 | esac
|
---|
132 |
|
---|
133 | case $'\b' in
|
---|
134 | [[:graph:]]) echo oops 3;;
|
---|
135 | esac
|
---|
136 |
|
---|
137 | case $'\b' in
|
---|
138 | [[:print:]]) echo oops 4;;
|
---|
139 | esac
|
---|
140 |
|
---|
141 | case $' ' in
|
---|
142 | [[:punct:]]) echo oops 5;;
|
---|
143 | esac
|
---|
144 |
|
---|
145 | # Next, test POSIX.2 collating symbols
|
---|
146 |
|
---|
147 | case 'a' in
|
---|
148 | [[.a.]]) echo ok 1;;
|
---|
149 | esac
|
---|
150 |
|
---|
151 | case '-' in
|
---|
152 | [[.hyphen.]-9]) echo ok 2;;
|
---|
153 | esac
|
---|
154 |
|
---|
155 | case 'p' in
|
---|
156 | [[.a.]-[.z.]]) echo ok 3;;
|
---|
157 | esac
|
---|
158 |
|
---|
159 | case '-' in
|
---|
160 | [[.-.]]) echo ok 4;;
|
---|
161 | esac
|
---|
162 |
|
---|
163 | case ' ' in
|
---|
164 | [[.space.]]) echo ok 5;;
|
---|
165 | esac
|
---|
166 |
|
---|
167 | case ' ' in
|
---|
168 | [[.grave-accent.]]) echo oops - grave;;
|
---|
169 | *) echo ok 6;;
|
---|
170 | esac
|
---|
171 |
|
---|
172 | case '4' in
|
---|
173 | [[.-.]-9]) echo ok 7;;
|
---|
174 | esac
|
---|
175 |
|
---|
176 | # an invalid collating symbol cannot be the first part of a range
|
---|
177 | case 'c' in
|
---|
178 | [[.yyz.]-[.z.]]) echo oops - yyz;;
|
---|
179 | *) echo ok 8;;
|
---|
180 | esac
|
---|
181 |
|
---|
182 | case 'c' in
|
---|
183 | [[.yyz.][.a.]-z]) echo ok 9;;
|
---|
184 | esac
|
---|
185 |
|
---|
186 | # but when not part of a range is not an error
|
---|
187 | case 'c' in
|
---|
188 | [[.yyz.][.a.]-[.z.]]) echo ok 10 ;;
|
---|
189 | esac
|
---|
190 |
|
---|
191 | case 'p' in
|
---|
192 | [[.a.]-[.Z.]]) echo oops -- bad range ;;
|
---|
193 | *) echo ok 11;;
|
---|
194 | esac
|
---|
195 |
|
---|
196 | case p in
|
---|
197 | [[.a.]-[.zz.]p]) echo ok 12;;
|
---|
198 | *) echo oops -- bad range 2;;
|
---|
199 | esac
|
---|
200 |
|
---|
201 | case p in
|
---|
202 | [[.aa.]-[.z.]p]) echo ok 13;;
|
---|
203 | *) echo oops -- bad range 3;;
|
---|
204 | esac
|
---|
205 |
|
---|
206 | case c in
|
---|
207 | [[.yyz.]cde]) echo ok 14;;
|
---|
208 | esac
|
---|
209 |
|
---|
210 | case abc in
|
---|
211 | [[.cb.]a-Za]*) echo ok 15;;
|
---|
212 | esac
|
---|
213 |
|
---|
214 | case $'\t' in
|
---|
215 | [[.space.][.tab.][.newline.]]) echo ok 16;;
|
---|
216 | esac
|
---|
217 |
|
---|
218 | # and finally, test POSIX.2 equivalence classes
|
---|
219 |
|
---|
220 | case "abc" in
|
---|
221 | [[:alpha:]][[=b=]][[:ascii:]]) echo ok 1;;
|
---|
222 | esac
|
---|
223 |
|
---|
224 | case "abc" in
|
---|
225 | [[:alpha:]][[=B=]][[:ascii:]]) echo oops -- =B=;;
|
---|
226 | *) echo ok 2 ;;
|
---|
227 | esac
|
---|
228 |
|
---|
229 | case a in
|
---|
230 | [[=b=]) echo oops;; # an incomplete equiv class is just a string
|
---|
231 | *) echo ok 3;;
|
---|
232 | esac
|
---|
233 |
|
---|