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