]> git.ipfire.org Git - thirdparty/bash.git/blame - tests/more-exp.tests
Bash-4.3 patch 7
[thirdparty/bash.git] / tests / more-exp.tests
CommitLineData
ccc6cda3
JA
1expect()
2{
3 echo expect "$@"
4}
5
6tool_var() {
7 eval $1=\"\${$1:-$2}\"
8 export $1
9}
10
11A="aaa bbb ccc"
12
13unset B
14
15tool_var B ${B:-"$A"}
16
17expect '<aaa bbb ccc>'
18recho "$A"
19expect '<aaa bbb ccc>'
20recho "$B"
21
22eto_prepend() {
23 eval $1=\'$2\''${'$1':+":"${'$1'}}'; export $1
24}
25
26foo=bar; export foo
27eto_prepend foo baz
28expect '<baz:bar>'
29recho $foo
30expect '<baz:bar>'
31recho ${foo-"bar"}
32
33aa='aaa bbb ccc'
34
35expect '<aaa bbb ccc>'
36recho ${zzz-"$aa"}
37expect '<bar>'
38recho ${zzz:-"bar"}
39expect '<bar>'
40recho "${zzz:-bar}"
41expect '<bar>'
42recho "${zzz:-"bar"}"
43
44var=abcde
45expect '<abcde>'
46recho "${var:-xyz}"
47expect '<abcde>'
48recho "${var:=xyz}"
49expect '<xyz>'
50recho "${var:+xyz}"
51
52set 'a b' c d e f
53expect '<a b> <c> <d> <e> <f>'
54recho ${1+"$@"}
55expect '<a b>'
56recho "${1-"$@"}"
57expect '<a> <b>'
58recho ${1-"$@"}
59expect '<a b> <c> <d> <e> <f>'
60recho "${1+$@}"
61expect '<a b> <c> <d> <e> <f>'
62recho "${1+"$@"}"
63
64HOME=/usr/homes/chet
65somevar=
66expect "<$HOME>"
67recho ${somevar:-~}
95732b49
JA
68# This changed after bash-3.0, when the tilde implementation was redone. It's
69# not backward compatible, but it's very hard to be backward-compatible here,
70# and I think the old behavior was a bug
71expect '<~>'
ccc6cda3
JA
72recho "${somevar:-~}"
73expect '<~>'
74recho "${somevar:-"~"}"
75expect '<\~>'
76recho "${somevar:-\~}"
77expect '<\ \~>'
78recho "${somevar:-\ \~}"
79expect '<\ \ \~>'
80recho "${somevar:-\ \ \~}"
81
82expect "<$HOME>"
83recho ${somevar:-$HOME}
84expect "<$HOME>"
85recho "${somevar:-$HOME}"
86expect "<$HOME>"
87recho "${somevar:-"$HOME"}"
88expect '<$HOME>'
89recho "${somevar:-\$HOME}"
90expect '<\ $HOME>'
91recho "${somevar:-\ \$HOME}"
92expect '<\ \ $HOME>'
93recho "${somevar:-\ \ \$HOME}"
94
95foo=bar
96expect "<'bar'>"
97recho "${foo+'$foo'}"
98expect "<'bar'>"
99recho "${fox='$foo'}"
100
101P='*@*'
7117c2d2 102expect '<*@>'
ccc6cda3 103recho "${P%"*"}"
7117c2d2 104expect '<*@>'
ccc6cda3
JA
105recho "${P%'*'}"
106
107expect '<*@>'
108recho ${P%"*"}
109expect '<*@>'
110recho ${P%'*'}
111
112expect '<*@*>'
113recho ${P%""}
114expect '<*@*>'
115recho ${P#""}
116
117expect '<*@*>'
118recho ${P#"$foobar"}
119expect '<*@*>'
120recho ${P%"$foobar"}
121
122s1=abcdefghijkl
123s2=efgh
124
125first=${s1/$s2*/}
126expect '<abcd>'
127recho $first
128
129last=${s1##$first}
130expect '<efghijkl>'
131recho $last
132
133shift $#
134UNAME_RELEASE=${1:-4.2MP}
135
136RELEASE=`expr "$UNAME_RELEASE" : '[^0-9]*\([0-9]*\)'` # 4
137case "$RELEASE" in
138"") RELEASE=0 ;;
139*) RELEASE=`expr "$RELEASE" + 0` ;;
140esac
141REL_LEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.\([0-9]*\)'` # 1
142REL_SUBLEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.[0-9]*.\([0-9]*\)'` # 2
143
144expect '<4> <2>'
145recho $RELEASE $REL_LEVEL $REL_SUBLEVEL
146
147b1()
148{
149 b2 ${1+"$@"}
150}
151
152b2()
153{
154 recho $*
155 recho $#
156}
157
158expect '<1>'
159b1 ''
160
161expect '<bar> <2>'
162b1 bar ''
163
164expect '<bar> <2>'
165b1 '' bar
166
167expect '<4>'
168b1 '' '' '' ''
169
170NL="\\
171"
172
173NNL="+$NL+"
174
175expect '<--\> <-->'
176recho --$NL--
177expect '<--\^J-->'
178recho "--$NL--"
179
180expect '<--+\> <+-->'
181recho --$NNL--
182expect '<--+\^J+-->'
183recho "--$NNL--"
184
185expect '<-+\> <+-\> <->'
186recho -$NNL-$NL-
187
188set ''
189expect '<xy>'
190recho "$*xy"
191expect '<xy>'
192recho "x$*y"
193expect '<xy>'
194recho "xy$*"
cce855bc
JA
195expect '<xy>'
196recho x"$*"y
197expect '<xy>'
198recho xy"$*"
199expect '<xy>'
200recho "$*"xy
ccc6cda3
JA
201expect '<>'
202recho "$*"
203expect nothing
204recho $*
205
206unset undef ; set ""
207
cce855bc
JA
208expect '<>'
209recho ${undef-"$*"}
210expect '<xy>'
211recho ${undef-"x$*y"}
212expect '<xy>'
213recho ${undef-"$*xy"}
214expect '<xy>'
215recho ${undef-"xy$*"}
216expect '<xy>'
217recho ${undef-x"$*"y}
218expect '<xy>'
219recho ${undef-xy"$*"}
220expect '<xy>'
221recho ${undef-"$*"xy}
222expect '<>'
223recho "${undef-$*}"
224expect nothing
225recho ${undef-$*}
226
227expect '<>'
ccc6cda3 228recho ${undef-"$zzz"}
cce855bc 229expect '<x>'
ccc6cda3 230recho x${undef-"$zzz"}
cce855bc 231expect '<x>'
ccc6cda3 232recho x${undef-"$@"}
cce855bc 233expect nothing
ccc6cda3 234recho ${undef-"$@"}
cce855bc 235expect '<x>'
ccc6cda3 236recho ${undef-"$zzz"}x
cce855bc 237expect '<x>'
ccc6cda3 238recho ${undef-"$@"}x
cce855bc 239expect '<x>'
ccc6cda3 240recho "$@"x
cce855bc 241expect '<x>'
ccc6cda3 242recho "$zzz"x
cce855bc 243expect '<^?>'
ccc6cda3 244recho ${undef-\7f}
cce855bc 245expect '<^?>'
ccc6cda3
JA
246recho ${undef-"\7f"}
247
248yyy=""
249recho "$xxx"x
250recho "$yyy"x
251
252set "" "abd" ""
253recho "$@"x
254recho "$@"$xxx
255
256OIFS="$IFS"
257
258arg=a,b,c,d,e,f
259
260IFS=,
261
262export z=$arg
263
264eval z1=\"$arg\"
265
266IFS="$OIFS"
267
268recho $z
269recho $z1
270
271# should give an error
272abc\=def
273
274zz="a b c d e"
275declare a=$zz
276
277recho "$a"
278recho $a
279
280recho $(echo "foo$(echo ")")")
281
282# test backslash escapes
283
284recho \a
285recho \\a
286
287recho "\a"
288recho "\\a"
289
290recho '\a'
291recho '\\a'
292
293recho $(zecho \a)
294recho $(zecho \\a)
295
296recho $(zecho "\a")
297recho $(zecho "\\a")
298
299recho $(zecho '\a')
300recho $(zecho '\\a')
301
302recho `zecho \a`
303recho `zecho \\a`
304
305recho `zecho "\a"`
306recho `zecho "\\a"`
307
308recho `zecho '\a'`
309recho `zecho '\\a'`
310
311a=foo
312
313recho \$a
314recho \\$a
315
316recho "\$a"
317recho "\\$a"
318
319recho '\$a'
320recho '\\$a'
321
322recho $(zecho `zecho \a`)
323recho $(zecho `zecho \\a`)
324
325recho $(zecho `zecho "\a"`)
326recho $(zecho `zecho "\\a"`)
327
328recho $(zecho `zecho '\a'`)
329recho $(zecho `zecho '\\a'`)
330
331# should echo G { I K }
332recho ${abc:-G { I } K }
333
334abc=hi
335
336# should echo hi K }
337recho ${abc:-G { I } K }
338
339# should echo a*
340unset foo
341recho "${foo:-"a"}*"
cce855bc
JA
342
343f ()
344{
345 echo "Number of args: $#"
346 echo "<\${*-x}>: <${*-x}>"
347 echo "<\${@-x}>: <${@-x}>"
348}
349
350f
351f ''
352f '' ''
353
354set 1 2 3 4 5
355
356expect '<5>'
357recho ${#}
358expect '<5>'
359recho ${#:foo}
360expect '<5>'
361recho ${#:-foo}
362expect '<5>'
363recho ${#-posparams}
364expect '<5>'
365recho ${#:-posparams}
366
367expect '<0>'
368recho ${#!}
369
370expect nothing
371recho $!
372expect nothing
373recho ${!}
374
375expect nothing
376recho $8
377expect nothing
378recho ${8}
379
380shift $#
381
382expect '<0>'
383recho ${#}
384expect '<0>'
385recho ${#:foo}
386expect '<0>'
387recho ${#:-foo}
388expect '<0>'
389recho ${#-posparams}
390expect '<0>'
391recho ${#:-posparams}
392
393expect '<posparams>'
394recho ${!-posparams}
395expect '<posparams>'
396recho ${!:-posparams}
397
398expect '<2>'
399recho ${#-}
400
401expect '<0>'
402recho ${#-posparams}
403
404expect '<0>'
405recho ${#?:-xyz}
406
407expect '<1>'
408recho ${#?}
409
410set a b c d e
411
412expect '<5>'
413recho ${#}
414expect '<5>'
415recho ${#?:-xyz}
416
417shift $#
418
419expect '<0>'
420recho ${#:-foo}
421
422expect a bad substitution error
423recho ${#:}
424expect a bad substitution error
425recho ${#/}
426expect a bad substitution error
427recho ${#%}
428expect a bad substitution error
429recho ${#=}
430expect a bad substitution error
431recho ${#+}
432expect a bad substitution error
433recho ${#1xyz}
434
435expect a math syntax error
436recho ${#:%}
437
438expect '<0>'
439recho ${#:-}
b72432fd
JA
440
441set --
442unset a b
443
444x=a
445y=b
446
447IFS=+
448
449expect '<a+b>'
450recho $x+$y
451expect '<+>'
452recho $a+$b
453
454expect '<+>'
455recho + "$@"
456expect '<+>'
457recho +"$@"
458
bb70624e
JA
459# variants of nested curly braces inside ${...} expressions
460
461# IFS is not the standard one
462
b72432fd
JA
463expect '<G { I>' '<K>' '<}>'
464recho ${gik:-G { I } K }
465
466abc=hi
467
468expect '<hi>' '<K>' '<}>'
469recho ${abc:-G { I } K }
bb70624e
JA
470
471# reset IFS to the default
472IFS='
473'
474
475# nested ${...} inside ${...} are handled specially
476unset XXX FOO BAR
477expect '<xxx>' '<yyy>'
478XXX=xxx
479FOO=${BAR:-${XXX} yyy}
480recho $FOO
481
482# this was a bug in versions of bash prior to bash-2.04-release
483set -- ''
484expect 1
485echo $#
486expect '<>'
28ef6c31
JA
487recho "${@}"
488expect '<>'
489recho "${@-}"
490expect '<>'
491recho "${@:-}"
492
493# this was a bug in bash-2.04, fixed in 2.05
494set -- a b
495expect '<:a:>' '<:b:>'
496for i in "${@-}"; do recho :$i:; done
497
498# I believe that ksh93 does these wrong -- we're using the rhs, so shouldn't
499# it behave the same as ""?
500set --
501expect '<>'
502recho "${@-}"
503expect '<>'
bb70624e 504recho "${@:-}"