]>
Commit | Line | Data |
---|---|---|
726f6388 JA |
1 | # |
2 | # A suite of tests for bash word expansions | |
3 | # | |
4 | # This tests parameter and variable expansion, with an empahsis on | |
5 | # proper quoting behavior. | |
6 | # | |
7 | # Chet Ramey | |
8 | ||
9 | # | |
10 | # If you comment out the body of this function, you can do a diff against | |
11 | # `expansion-tests.right' to see if the shell is behaving correctly | |
12 | # | |
13 | expect() | |
14 | { | |
15 | echo expect "$@" | |
16 | } | |
17 | ||
18 | # Test the substitution quoting characters (CTLESC and CTLNUL) in different | |
19 | # combinations | |
20 | ||
21 | expect "<^A>" | |
22 | recho `echo '\ 1'` | |
23 | expect "<^A>" | |
24 | recho `echo "\ 1"` | |
ac50fbac CR |
25 | expect "<^?>" |
26 | recho `echo '\7f'` | |
27 | expect "<^?>" | |
28 | recho `echo "\7f"` | |
726f6388 JA |
29 | expect "<^A>" |
30 | recho `echo \ 1` | |
ac50fbac CR |
31 | expect "<^?>" |
32 | recho `echo \7f` | |
726f6388 | 33 | |
a0c0a00f CR |
34 | expect "bar" |
35 | recho ${foo:-"`echo bar`"} | |
36 | expect "<^A>" | |
37 | recho ${foo:-"`echo \ 1`"} | |
38 | expect "<^?>" | |
39 | recho ${foo:-"`echo \7f`"} | |
40 | ||
41 | expect "<^A>" | |
42 | recho "`echo \ 1`" | |
43 | expect "<^?>" | |
44 | recho "`echo \7f`" | |
45 | ||
726f6388 JA |
46 | # Test null strings without variable expansion |
47 | expect "<abcdefgh>" | |
48 | recho abcd""efgh | |
49 | expect "<abcdefgh>" | |
50 | recho abcd''efgh | |
51 | expect "<abcdefgh>" | |
52 | recho ""abcdefgh | |
53 | expect "<abcdefgh>" | |
54 | recho ''abcdefgh | |
55 | expect "<abcd>" | |
56 | recho abcd"" | |
57 | expect "<abcd>" | |
58 | recho abcd'' | |
59 | ||
60 | # Test the quirky behavior of $@ in "" | |
61 | expect nothing | |
62 | recho "$@" | |
63 | expect "< >" | |
64 | recho " $@" | |
65 | expect "<-->" | |
66 | recho "-${@}-" | |
67 | ||
68 | # Test null strings with variable expansion that fails | |
69 | expect '<>' | |
70 | recho $xxx"" | |
71 | expect '<>' | |
72 | recho ""$xxx | |
73 | expect '<>' | |
74 | recho $xxx'' | |
75 | expect '<>' | |
76 | recho ''$xxx | |
77 | expect '<>' | |
78 | recho $xxx""$yyy | |
79 | expect '<>' | |
80 | recho $xxx''$yyy | |
81 | ||
82 | # Test null strings with variable expansion that succeeds | |
83 | xxx=abc | |
84 | yyy=def | |
85 | ||
86 | expect '<abc>' | |
87 | recho $xxx"" | |
88 | expect '<abc>' | |
89 | recho ""$xxx | |
90 | expect '<abc>' | |
91 | recho $xxx'' | |
92 | expect '<abc>' | |
93 | recho ''$xxx | |
94 | expect '<abcdef>' | |
95 | recho $xxx""$yyy | |
96 | expect '<abcdef>' | |
97 | recho $xxx''$yyy | |
98 | ||
99 | unset xxx yyy | |
100 | ||
101 | # Test the unquoted special quoting characters | |
102 | expect "<^A>" | |
103 | recho \ 1 | |
ac50fbac CR |
104 | expect "<^?>" |
105 | recho \7f | |
726f6388 JA |
106 | expect "<^A>" |
107 | recho "\ 1" | |
ac50fbac CR |
108 | expect "<^?>" |
109 | recho "\7f" | |
726f6388 JA |
110 | expect "<^A>" |
111 | recho '\ 1' | |
ac50fbac CR |
112 | expect "<^?>" |
113 | recho '\7f' | |
726f6388 JA |
114 | |
115 | # Test expansion of a variable that is unset | |
116 | expect nothing | |
117 | recho $xxx | |
118 | expect '<>' | |
119 | recho "$xxx" | |
120 | ||
121 | expect nothing | |
122 | recho "$xxx${@}" | |
123 | ||
124 | # Test empty string expansion | |
125 | expect '<>' | |
126 | recho "" | |
127 | expect '<>' | |
128 | recho '' | |
129 | ||
130 | # Test command substitution with (disabled) history substitution | |
131 | expect '<Hello World!>' | |
132 | # set +H | |
133 | recho "`echo \"Hello world!\"`" | |
134 | ||
135 | # Test some shell special characters | |
136 | expect '<`>' | |
137 | recho "\`" | |
138 | expect '<">' | |
139 | recho "\"" | |
140 | expect '<\^A>' | |
141 | recho "\\ 1" | |
142 | ||
143 | expect '<\$>' | |
144 | recho "\\$" | |
145 | ||
146 | expect '<\\>' | |
147 | recho "\\\\" | |
148 | ||
149 | # This should give argv[1] = a argv[2] = b | |
150 | expect '<a> <b>' | |
151 | FOO=`echo 'a b' | tr ' ' '\012'` | |
152 | recho $FOO | |
153 | ||
ac50fbac CR |
154 | # This should give argv[1] = ^A argv[2] = ^? |
155 | expect '<^A> <^?>' | |
156 | FOO=`echo '\ 1 \7f' | tr ' ' '\012'` | |
726f6388 JA |
157 | recho $FOO |
158 | ||
159 | # Test quoted and unquoted globbing characters | |
160 | expect '<**>' | |
161 | recho "*"* | |
162 | ||
163 | expect '<\.\./*/>' | |
164 | recho "\.\./*/" | |
165 | ||
166 | # Test patterns that come up when the shell quotes funny character | |
167 | # combinations | |
ac50fbac CR |
168 | expect '<^A^?^A^?>' |
169 | recho '\ 1\7f\ 1\7f' | |
726f6388 JA |
170 | expect '<^A^A>' |
171 | recho '\ 1\ 1' | |
ac50fbac CR |
172 | expect '<^A^?>' |
173 | recho '\ 1\7f' | |
174 | expect '<^A^A^?>' | |
175 | recho '\ 1\ 1\7f' | |
726f6388 JA |
176 | |
177 | # More tests of "$@" | |
726f6388 | 178 | set abc def ghi jkl |
ccc6cda3 | 179 | expect '< abc> <def> <ghi> <jkl >' |
726f6388 | 180 | recho " $@ " |
ccc6cda3 JA |
181 | expect '< abc> <def> <ghi> <jkl >' |
182 | recho "${1+ $@ }" | |
726f6388 | 183 | |
726f6388 | 184 | set abc def ghi jkl |
ccc6cda3 | 185 | expect '<--abc> <def> <ghi> <jkl-->' |
726f6388 JA |
186 | recho "--$@--" |
187 | ||
ccc6cda3 JA |
188 | set "a b" cd ef gh |
189 | expect '<a b> <cd> <ef> <gh>' | |
190 | recho ${1+"$@"} | |
191 | expect '<a b> <cd> <ef> <gh>' | |
192 | recho ${foo:-"$@"} | |
193 | expect '<a b> <cd> <ef> <gh>' | |
194 | recho "${@}" | |
195 | ||
726f6388 JA |
196 | expect '< >' |
197 | recho " " | |
198 | expect '< - >' | |
199 | recho " - " | |
200 | ||
201 | # Test combinations of different types of quoting in a fully-quoted string | |
202 | # (so the WHOLLY_QUOTED tests fail and it doesn't get set) | |
203 | expect '</^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/>' | |
204 | recho "/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*"'$'"/\1/" | |
205 | ||
206 | # Test the various Posix parameter expansions | |
207 | ||
208 | expect '<foo bar>' | |
209 | recho "${x:-$(echo "foo bar")}" | |
210 | expect '<foo> <bar>' | |
211 | recho ${x:-$(echo "foo bar")} | |
212 | ||
213 | unset X | |
214 | expect '<abc>' | |
215 | recho ${X:=abc} | |
216 | expect '<abc>' | |
217 | recho $X | |
218 | ||
219 | set a b c | |
220 | expect '<posix>' | |
221 | recho ${3:+posix} | |
222 | ||
223 | POSIX=/usr/posix | |
224 | expect '<10>' | |
225 | recho ${#POSIX} | |
226 | ||
227 | # remove shortest trailing match | |
228 | x=file.c | |
229 | expect '<file.o>' | |
230 | recho ${x%.c}.o | |
231 | ||
232 | # remove longest trailing match | |
233 | x=posix/src/std | |
234 | expect '<posix>' | |
235 | recho ${x%%/*} | |
236 | ||
237 | # remove shortest leading pattern | |
238 | x=$HOME/src/cmd | |
239 | expect '</src/cmd>' | |
240 | recho ${x#$HOME} | |
241 | ||
242 | # remove longest leading pattern | |
243 | x=/one/two/three | |
244 | expect '<three>' | |
245 | recho ${x##*/} | |
246 | ||
d166f048 JA |
247 | # pattern removal of patterns that don't match |
248 | z=abcdef | |
249 | ||
250 | expect '<abcdef>' | |
251 | recho ${z#xyz} | |
252 | expect '<abcdef>' | |
253 | recho ${z##xyz} | |
254 | ||
255 | expect '<abcdef>' | |
256 | recho ${z%xyz} | |
257 | expect '<abcdef>' | |
258 | recho ${z%%xyz} | |
259 | ||
726f6388 JA |
260 | # Command substitution and the quirky differences between `` and $() |
261 | ||
262 | expect '<\$x>' | |
263 | recho '\$x' | |
264 | ||
265 | expect '<$x>' | |
266 | recho `echo '\$x'` | |
267 | ||
268 | expect '<\$x>' | |
269 | recho $(echo '\$x') | |
270 | ||
271 | # The difference between $* "$*" and "$@" | |
272 | ||
273 | set "abc" "def ghi" "jkl" | |
274 | ||
275 | expect '<abc> <def> <ghi> <jkl>' | |
276 | recho $* | |
277 | ||
278 | expect '<abc def ghi jkl>' | |
279 | recho "$*" | |
280 | ||
281 | OIFS="$IFS" | |
282 | IFS=":$IFS" | |
283 | ||
284 | # The special behavior of "$*", using the first character of $IFS as separator | |
285 | expect '<abc:def ghi:jkl>' | |
286 | recho "$*" | |
287 | ||
288 | IFS="$OIFS" | |
289 | ||
290 | expect '<abc> <def ghi> <jkl>' | |
291 | recho "$@" | |
292 | ||
293 | expect '<xxabc> <def ghi> <jklyy>' | |
294 | recho "xx$@yy" | |
295 | ||
296 | expect '<abc> <def ghi> <jklabc> <def ghi> <jkl>' | |
297 | recho "$@$@" | |
298 | ||
299 | foo=abc | |
300 | bar=def | |
301 | ||
302 | expect '<abcdef>' | |
303 | recho "$foo""$bar" | |
304 | ||
305 | unset foo | |
306 | set $foo bar '' xyz "$foo" abc | |
307 | ||
308 | expect '<bar> <> <xyz> <> <abc>' | |
309 | recho "$@" | |
310 | ||
311 | # More tests of quoting and deferred evaluation | |
312 | ||
313 | foo=10 x=foo | |
314 | y='$'$x | |
315 | expect '<$foo>' | |
316 | recho $y | |
317 | eval y='$'$x | |
318 | expect '<10>' | |
319 | recho $y | |
320 | ||
321 | # case statements | |
322 | ||
323 | NL=' | |
324 | ' | |
325 | x='ab | |
326 | cd' | |
327 | ||
328 | expect '<newline expected>' | |
329 | case "$x" in | |
330 | *$NL*) recho "newline expected" ;; | |
331 | esac | |
332 | ||
333 | expect '<got it>' | |
334 | case \? in | |
335 | *"?"*) recho "got it" ;; | |
336 | esac | |
337 | ||
338 | expect '<got it>' | |
339 | case \? in | |
340 | *\?*) recho "got it" ;; | |
341 | esac | |
342 | ||
343 | set one two three four five | |
344 | expect '<one> <three> <five>' | |
345 | recho $1 $3 ${5} $8 ${9} | |
d166f048 JA |
346 | |
347 | # length tests on positional parameters and some special parameters | |
348 | ||
726f6388 JA |
349 | expect '<5> <5>' |
350 | recho $# ${#} | |
d166f048 JA |
351 | expect '<3>' |
352 | recho ${#1} | |
353 | expect '<1>' | |
354 | recho ${##} | |
355 | expect '<1>' | |
356 | recho ${#?} | |
357 | expect '<5>' | |
358 | recho ${#@} | |
359 | expect '<5>' | |
360 | recho ${#*} | |
361 | expect '<5>' | |
362 | recho "${#@}" | |
363 | expect '<5>' | |
364 | recho "${#*}" | |
726f6388 JA |
365 | |
366 | expect '<42>' | |
367 | recho $((28 + 14)) | |
368 | expect '<26>' | |
369 | recho $[ 13 * 2 ] | |
370 | ||
371 | expect '<\>' | |
372 | recho `echo \\\\` | |
373 | ||
374 | expect '<~>' | |
375 | recho '~' | |
376 | ||
377 | expect nothing | |
378 | recho $! | |
d166f048 JA |
379 | expect nothing |
380 | recho ${!} | |
ccc6cda3 JA |
381 | |
382 | # test word splitting of assignment statements not preceding a command | |
383 | a="a b c d e" | |
384 | declare b=$a | |
385 | expect '<a> <b> <c> <d> <e>' | |
386 | recho $b | |
95732b49 JA |
387 | |
388 | a="a?b?c" | |
389 | ||
390 | echo ${a//\\?/ } | |
391 | ||
392 | echo ${a//\?/ } | |
3185942a JA |
393 | |
394 | ${THIS_SH} ./exp1.sub | |
395 | ||
396 | ${THIS_SH} ./exp2.sub | |
0001803f CR |
397 | |
398 | ${THIS_SH} ./exp3.sub | |
495aee44 CR |
399 | |
400 | ${THIS_SH} ./exp4.sub | |
ac50fbac CR |
401 | |
402 | ${THIS_SH} ./exp5.sub | |
403 | ||
404 | ${THIS_SH} ./exp6.sub | |
a0c0a00f CR |
405 | ${THIS_SH} ./exp7.sub |
406 | ${THIS_SH} ./exp8.sub | |
407 | ${THIS_SH} ./exp9.sub | |
d233b485 CR |
408 | ${THIS_SH} ./exp10.sub |
409 | ${THIS_SH} ./exp11.sub | |
410 | ${THIS_SH} ./exp12.sub |