cae732e38940282e09ae1e8756aa95d6af022aa9
[platform/upstream/bash.git] / tests / new-exp.tests
1 # must do this because posix mode causes process substitution to be disabled
2 # and flagged as a syntax error, which causes the shell to exit
3 set +o posix
4
5 expect()
6 {
7         echo expect "$@"
8 }
9
10 HOME=/usr/homes/chet    # to make the check against new-exp.right work
11 expect '<foo bar>'
12 recho "${undef-"foo bar"}"      # should be foo bar
13 expect '<foo>'
14 recho "${und="foo"}"            # should be foo
15
16 expect "<$HOME>"
17 recho ${HOME-"}"}
18 expect "<$HOME>"
19 recho "${HOME-'}'}"
20 expect "<$HOME>"
21 recho "${HOME-"}"}"
22
23 expect $0: 'HOME: }: syntax error: operand expected (error token is "}")'
24 recho "${HOME:`echo }`}"        # should be a math error -- bad substring substitution
25
26 expect unset
27 _ENV=oops
28 x=${_ENV[(_$-=0)+(_=1)-_${-%%*i*}]}     # memory leak
29 echo ${x:-unset}
30
31 expect "<$HOME>"
32 recho ${HOME}
33 expect "<$HOME>"
34 recho ${HOME:-`echo }`}
35 expect "<$HOME>"
36 recho ${HOME:-`echo "}"`}
37 expect "<$HOME>"
38 recho "${HOME:-`echo "}"`}"
39 expect "<$HOME>"
40 recho "$(echo "${HOME}")"
41 expect "<$HOME>"
42 recho "$(echo "$(echo ${HOME})")"
43 expect "<$HOME>"
44 recho "$(echo "$(echo "${HOME}")")"
45
46 P=*@*
47 expect '<*@*>'
48 recho "${P%"*"}"        # 
49 expect '<*@*>'
50 recho "${P%'*'}"        # 
51 expect '<@*>'
52 recho "${P#\*}"         # should be @*
53
54 expect '<)>'
55 recho "$(echo ")")"     # should be )
56 expect '<")">'
57 recho "$(echo "\")\"")" # should be ")"
58
59 foo='abcd   '
60 expect '<-abcd> <->'
61 recho -${foo}-          # should be -abcd -
62 expect '<-abcd> <->'
63 recho -${foo% *}-       # should be -abcd -
64 expect '<-abcd->'
65 recho -${foo%% *}-      # should be -abcd-
66
67 set a b c d e
68 expect '<a b c d e>'
69 IFS=""
70 recho "$@"
71 IFS='   
72 '
73
74 foo=bar
75 expect '<bar foo>'
76 echo -n $foo' ' ; echo foo
77
78 expect '<bar foo>'
79 echo -n $foo" " ; echo foo
80
81 expect '<bar foo>'
82 echo -n "$foo " ; echo foo
83
84 expect '<barfoo>'
85 echo -e "$foo\c " ; echo foo
86
87 expect '<barfoo>'
88 echo -e $foo"\c " ; echo foo
89
90 # make sure backslashes are preserved in front of characters that are not
91 # valid backslash escapes
92 expect '<\x>'
93 echo -e '\x'
94
95 # substring tests
96 z=abcdefghijklmnop
97 expect '<abcd>'
98 recho ${z:0:4}
99
100 expect '<efg> <nop>'
101 recho ${z:4:3} ${z:${#z}-3:3}
102
103 expect '<efg> <nop>'
104 recho ${z:4:3} ${z: -3:3}
105
106 expect '<hijklmnop>'
107 recho ${z:7:30}
108
109 expect '<abcdefghijklmnop>'
110 recho ${z:0:100}
111
112 expect '<abcdefghijklmnop>'
113 recho ${z:0:${#z}}
114
115 set 'ab cd' 'ef' 'gh ij' 'kl mn' 'op'
116 expect '<ab cd> <ef>'
117 recho "${@:1:2}"
118
119 expect '<gh ij> <kl mn>'
120 recho "${@:3:2}"
121
122 expect '<gh ij> <kl mn> <op>'
123 recho "${@:3:4}"
124
125 expect '<ab cd> <ef> <gh ij> <kl mn> <op>'
126 recho "${@:1:$#}"
127
128 # indirect variable references
129 expect '<abcdefghijklmnop>'
130 recho ${!9:-$z}
131
132 ef=4
133 expect '<4>'
134 recho ${!2}
135
136 expect '<op>'
137 recho ${!#}
138
139 set a b c d e
140 a=
141 expect '<abcdefghijklmnop>'
142 recho ${a:-$z}
143 expect '<abcdefghijklmnop>'
144 recho ${!1:-$z}
145
146 expect nothing
147 recho ${a-$z}
148 expect nothing
149 recho ${!1-$z}
150
151 set -u
152 expect $0: ABX: unbound variable
153 ( recho ${ABX} )
154 set +u
155
156 expect $0: '$6: cannot assign in this way'
157 recho ${6="arg6"}
158
159 v=abcde
160
161 # sed-like variable substitution
162 expect '<xxcde>'
163 recho ${v/a[a-z]/xx}
164 expect '<axxde>'
165 recho ${v/a??/axx}
166 expect '<abxyz>'
167 recho ${v/c??/xyz}
168 expect '<abbcde>'
169 recho ${v/#a/ab}
170 expect '<abcde>'
171 recho ${v/#d/ab}
172 expect '<abcabe>'
173 recho ${v/d/ab}
174 expect '<abcdlast>'
175 recho ${v/%?/last}
176 expect '<abcde>'
177 recho ${v/%x/last}
178
179 av=(abcd efgh ijkl mnop qrst uvwx)
180
181 expect '<xxcd>'
182 recho ${av/??/xx}
183 expect '<abxx>'
184 recho ${av/%??/xx}
185 expect '<xxgh>'
186 recho ${av[1]/??/xx}
187 expect '<efgh>'
188 recho ${av[1]/%ab/xx}
189 expect '<xxfgh>'
190 recho ${av[1]/#?/xx}
191 expect '<zagh>'
192 recho ${av[1]/??/za}
193 expect '<zaza>'
194 recho ${av[1]//??/za}
195 expect '<zagh>'
196 recho ${av[1]//#??/za}
197 expect '<efza>'
198 recho ${av[1]//%??/za}
199
200 expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>'
201 recho ${av[@]/*/yyy}
202 expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>'
203 recho ${av[@]/#*/yyy}
204 expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>'
205 recho ${av[@]/%*/yyy}
206 expect '<yyy> <efgh> <ijkl> <mnop> <qrst> <uvwx>'
207 recho ${av[@]/a*/yyy}
208 expect '<abxx> <efxx> <ijxx> <mnxx> <qrxx> <uvxx>'
209 recho ${av[@]/%??/xx}
210
211 set abcd efgh ijkl mnop qrst uvwx
212
213 expect '<xxcd>'
214 recho ${1/??/xx}
215 expect '<xxcd> <xxgh> <xxkl> <xxop> <xxst> <xxwx>'
216 recho ${@/??/xx}
217 expect '<xxcd> <xxgh> <xxkl> <xxop> <xxst> <xxwx>'
218 recho ${@/%??/xx}
219 expect '<zaza>'
220 recho ${3//??/za}
221 expect '<efza>'
222 recho ${3//%??/za}
223 expect '<zaza> <zaza> <zaza> <zaza> <zaza> <zaza>'
224 recho ${@//??/za}
225 expect '<zacd> <zagh> <zakl> <zaop> <zast> <zawx>'
226 recho ${@//#??/za}
227 expect '<yyy> <yyy> <yyy> <yyy> <yyy> <yyy>'
228 recho ${@//*/yyy}
229 expect '<yyy> <efgh> <ijkl> <mnop> <qrst> <uvwx>'
230 recho ${@//a*/yyy}
231 expect '<abcd> <efgh> <ijkl> <mnop> <qrst> <uvwyyy>'
232 recho ${@//%x*/yyy}
233
234 expect a newline
235 echo $abmcde
236
237 # run process substitution tests in a subshell so that syntax errors
238 # caused by a shell not implementing process substitution (e.g., one
239 # built on a NeXT) will not cause the whole test to exit prematurely
240 ${THIS_SH} ./new-exp.sub1
241
242 expect $0: '${#:-foo}: bad substitution'
243 echo ${#:-foo}
244 expect $0: '${#:}: bad substitution'
245 echo ${#:}
246
247 expect "<'>"
248 recho "'"
249 expect '<">'
250 recho '"'
251 expect '<"hello">'
252 recho "\"hello\""
253
254 shift $#
255 unset foo
256 z=abcdef
257 z1='abc def'
258
259 expect '<>'
260 recho ${foo:-""}
261 expect nothing
262 recho ${foo:-"$@"}
263 expect '<>'
264 recho "${foo:-$@}"
265
266 # unset var
267 expect '<>'
268 recho ${foo:-"$zbcd"}
269 expect nothing
270 recho ${foo:-$zbcd}
271
272 # set var
273 expect '<abcdef>'
274 recho ${foo:-"$z"}
275 expect '<abc def>'
276 recho ${foo:-"$z1"}
277
278 expect '<abcdef>'
279 recho ${foo:-$z}
280 expect '<abc> <def>'
281 recho ${foo:-$z1}
282
283 expect '<abcdef>'
284 recho "${foo:-$z}"
285 expect '<abc def>'
286 recho "${foo:-$z1}"
287
288 expect '<abcdef>'
289 recho "${foo:-"$z"}"
290 # this disagrees with sh and ksh, but I think it is right according
291 # to posix.2.
292 expect '<abc def>'
293 recho "${foo:-"$z1"}"
294
295 set ab cd ef gh
296 expect '<ab> <cd> <ef> <gh>'
297 recho ${foo:-"$@"}
298 expect '<ab> <cd> <ef> <gh>'
299 recho "${foo:-$@}"
300 expect '<ab> <cd> <ef> <gh>'
301 recho "${foo:-"$@"}"
302
303 shift $#
304 expect nothing
305 recho $xxx"$@"
306 expect nothing
307 recho ${foo:-$xxx"$@"}
308 expect '<>'
309 recho "${foo:-$xxx$@}"
310 expect '<>'
311 recho "${foo:-$xxx"$@"}"
312
313 expect nothing
314 recho $xxx"$@"
315 expect nothing
316 recho "$xxx$@"
317 expect nothing
318 recho "$@"$xxx
319
320 expect '<>'
321 recho $xxx""
322 expect '<>'
323 recho $xxx''
324 expect '<>'
325 recho ''$xxx
326 expect '<>'
327 recho ""$xxx
328
329 AB='abcdefghijklmnopqrstuvwxyz'
330
331 recho ${AB:7:15}
332 recho ${AB:15:7}
333
334 recho ${AB:20}
335
336 recho ${AB:0}
337 recho ${AB:0:20}
338
339 recho ${AB:10:7}
340 recho ${AB:10:3+4}
341 recho ${AB:20/2:3+4}
342
343 set 1 2 3 4 5 6
344 recho \""${*:2:2}"\"
345
346 IFS=:
347 recho \""${*:2:2}"\"
348
349 IFS=$' \t\n'
350
351 z=123456
352
353 recho \""${z:2:2}"\"
354 recho \""${z:2}"\"
355 recho \""${z:2:4}"\"
356 recho \""${z:2:6}"\"
357
358 set $'\1' $'\2' $'\177'
359
360 recho $*
361 recho $@
362
363 recho ${*}
364 recho ${@}
365
366 xx=one/two/two
367 recho ${xx%/*}
368 recho ${xx/\/two}
369
370 yy=oneonetwo
371 recho ${yy//one}
372 recho ${yy/\/one}
373
374 xx=oneonetwo
375
376 recho ${xx/one}
377 recho ${xx//one}
378 recho ${xx/\/one}
379
380 # out-of-range substrings
381 var=abc
382 c=${var:3}
383 expect nothing
384 recho $c
385 c=${var:4}
386 expect nothing
387 recho $c
388 expect '<./new-exp.tests: -2: substring expression < 0>'
389 c=${var:0:-2}
390
391 var=abcdefghi
392 c=${var:3:12}
393 recho $c
394 c=${var:4:20}
395 recho $c
396
397 # make sure null patterns work
398 xxx=endocrine
399 yyy=n
400 unset zzz
401
402 recho ${xxx/$yyy/*}
403 recho ${xxx//$yyy/*}
404
405 recho ${xxx/$zzz/*}
406 recho ${xxx//$zzz/*}
407
408 # another case that caused a core dump in bash-2.0
409 XPATH=/usr/bin:/bin:/usr/local/bin:/usr/gnu/bin::/usr/bin/X11:/sbin:/usr/sbin
410
411 recho ${XPATH//:/ }
412
413 xx=(ar as at au av aw ax ay az)
414
415 recho ${xx[@]/a/}
416 recho ${xx[@]//a/}
417
418 recho ${xx[*]/a/}
419 recho ${xx[*]//a/}
420
421 recho ${xx[@]%?}
422 recho ${xx[*]%?}
423
424 recho ${xx[@]#?}
425 recho ${xx[*]#?}
426
427 set -- ar as at au av aw ax ay az
428
429 recho ${@/a/}
430 recho ${@//a/}
431
432 recho ${*/a/}
433 recho ${*//a/}
434
435 recho ${@%?}
436 recho ${*%?}
437
438 recho ${@#?}
439 recho ${*#?}
440
441 shift $#
442 set -u
443 ( recho $9 ; echo after 1)
444 ( recho ${9} ; echo after 2)
445 ( recho $UNSET ; echo after 3)
446 ( recho ${UNSET} ; echo after 4)
447 ( recho "$UNSET" ; echo after 5)
448 ( recho "${UNSET}" ; echo after 6)
449 ( recho "${#UNSET}" ; echo after 7)
450 set +u
451
452 # this must be last!
453 expect $0: 'ABXD: parameter unset'
454 recho ${ABXD:?"parameter unset"}