source: vendor/bash/3.1-p17/tests/array.tests

Last change on this file was 3228, checked in by bird, 18 years ago

bash 3.1

File size: 7.1 KB
Line 
1# this is needed so that the bad assignments (b[]=bcde, for example) do not
2# cause fatal shell errors when in posix mode
3set +o posix
4
5set +a
6# The calls to egrep -v are to filter out builtin array variables that are
7# automatically set and possibly contain values that vary.
8
9# first make sure we handle the basics
10x=()
11echo ${x[@]}
12unset x
13
14# this should be an error
15test=(first & second)
16echo $?
17unset test
18
19# make sure declare -a converts an existing variable to an array
20unset a
21a=abcde
22declare -a a
23echo ${a[0]}
24
25unset a
26a=abcde
27a[2]=bdef
28
29unset b
30declare -a b[256]
31
32unset c[2]
33unset c[*]
34
35a[1]=
36
37_ENV=/bin/true
38x=${_ENV[(_$-=0)+(_=1)-_${-%%*i*}]}
39
40declare -r c[100]
41
42echo ${a[0]} ${a[4]}
43echo ${a[@]}
44
45echo ${a[*]}
46
47# this should print out values, too
48declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
49
50unset a[7]
51echo ${a[*]}
52
53unset a[4]
54echo ${a[*]}
55
56echo ${a}
57echo "${a}"
58echo $a
59
60unset a[0]
61echo ${a}
62
63echo ${a[@]}
64
65a[5]="hello world"
66echo ${a[5]}
67echo ${#a[5]}
68
69echo ${#a[@]}
70
71a[4+5/2]="test expression"
72echo ${a[@]}
73
74readonly a[5]
75readonly a
76# these two lines should output `declare' commands
77readonly -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
78declare -ar | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
79# this line should output `readonly' commands, even for arrays
80set -o posix
81readonly -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
82set +o posix
83
84declare -a d='([1]="" [2]="bdef" [5]="hello world" "test")'
85d[9]="ninth element"
86
87declare -a e[10]=test # this works in post-bash-2.05 versions
88declare -a e[10]='(test)'
89
90pass=/etc/passwd
91declare -a f='("${d[@]}")'
92b=([0]=this [1]=is [2]=a [3]=test [4]="$PS1" [5]=$pass)
93
94echo ${b[@]:2:3}
95
96declare -pa | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
97
98a[3]="this is a test"
99
100b[]=bcde
101b[*]=aaa
102echo ${b[ ]}
103
104c[-2]=4
105echo ${c[-4]}
106
107d[7]=(abdedfegeee)
108
109d=([]=abcde [1]="test test" [*]=last [-65]=negative )
110
111unset d[12]
112unset e[*]
113
114declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
115
116ps1='hello'
117unset ps1[2]
118unset ${ps1[2]}
119
120declare +a ps1
121declare +a c
122
123# the prompt should not print when using a here doc
124read -p "array test: " -a rv <<!
125this is a test of read using arrays
126!
127
128echo ${rv[0]} ${rv[4]}
129echo ${rv[@]}
130
131# the variable should be converted to an array when `read -a' is done
132vv=1
133read -a vv <<!
134this is a test of arrays
135!
136echo ${vv[0]} ${vv[3]}
137echo ${vv[@]}
138unset vv
139
140declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
141
142export rv
143#set
144
145x[4]=bbb
146x=abde
147echo $x
148echo ${x[0]}
149echo ${x[4]}
150echo efgh | ( read x[1] ; echo ${x[1]} )
151echo wxyz | ( declare -a x ; read x ; echo $x ; echo ${x[0]} )
152
153# Make sure that arrays can be used to save the positional paramters verbatim
154set -- a 'b c' d 'e f g' h
155
156ARGV=( [0]=$0 "$@" )
157
158for z in "${ARGV[@]}"
159do
160 echo "$z"
161done
162
163echo "$0"
164for z in "$@"
165do
166 echo "$z"
167done
168
169# do various pattern removal and length tests
170XPATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:.:/sbin:/usr/sbin
171
172xpath=( $( IFS=: ; echo $XPATH ) )
173
174echo ${xpath[@]}
175echo ${xpath[@]##*/}
176echo ${xpath[0]##*/}
177echo ${xpath[@]%%[!/]*}
178echo ${xpath[0]%%[!/]*}
179recho ${xpath##*/}
180recho ${xpath%%[!/]*}
181recho ${xpath[5]##*/}
182recho ${xpath[5]%%[!/]*}
183
184# let's try to make it a DOS-style path
185
186zecho "${xpath[@]/\//\\}"
187zecho "${xpath[@]//\//\\}"
188zecho "${xpath[@]//[\/]/\\}"
189
190# length of the first element of the array, since array without subscript
191# is equivalent to referencing first element
192echo ${#xpath} -- ${#xpath[0]}
193
194# number of elements in the array
195nelem=${#xpath[@]}
196echo ${#xpath[@]} -- $nelem
197
198# total length of all elements in the array, including space separators
199xx="${xpath[*]}"
200echo ${#xx}
201
202# total length of all elements in the array
203xx=$( IFS='' ; echo "${xpath[*]}" )
204echo ${#xx}
205
206unset xpath[nelem-1]
207
208nelem=${#xpath[@]}
209echo ${#xpath[@]} -- $nelem
210
211# arrays and things that look like index assignments
212array=(42 [1]=14 [2]=44)
213
214array2=(grep [ 123 ] \*)
215
216echo ${array[@]}
217echo "${array2[@]}"
218
219# arrays and implicit arithmetic evaluation
220declare -i -a iarray
221
222iarray=( 2+4 1+6 7+2 )
223echo ${iarray[@]}
224
225iarray[4]=4+1
226echo ${iarray[@]}
227
228# make sure assignment using the compound assignment syntax removes all
229# of the old elements from the array value
230barray=(old1 old2 old3 old4 old5)
231barray=(new1 new2 new3)
232echo "length = ${#barray[@]}"
233echo "value = ${barray[*]}"
234
235# make sure the array code behaves correctly with respect to unset variables
236set -u
237( echo ${#narray[4]} )
238
239${THIS_SH} ./array1.sub
240${THIS_SH} ./array2.sub
241
242# some old bugs and ksh93 compatibility tests
243${THIS_SH} ./array3.sub
244
245set +u
246cd /tmp
247
248touch 1=bar
249foo=([10]="bar")
250echo ${foo[0]}
251rm 1=bar
252
253foo=(a b c d e f g)
254echo ${foo[@]}
255
256# quoted reserved words are ok
257foo=(\for \case \if \then \else)
258echo ${foo[@]}
259
260# quoted metacharacters are ok
261foo=( [1]='<>' [2]='<' [3]='>' [4]='!' )
262echo ${foo[@]}
263
264# numbers are just words when not in a redirection context
265foo=( 12 14 16 18 20 )
266echo ${foo[@]}
267
268foo=( 4414758999202 )
269echo ${foo[@]}
270
271# this was a bug in all versions of bash 2.x up to and including bash-2.04
272declare -a ddd=(aaa
273bbb)
274echo ${ddd[@]}
275
276# errors until post-bash-2.05a; now reserved words are OK
277foo=(a b c for case if then else)
278
279foo=(for case if then else)
280
281# errors
282metas=( <> < > ! )
283metas=( [1]=<> [2]=< [3]=> [4]=! )
284
285# various expansions that didn't really work right until post-bash-2.04
286foo='abc'
287echo ${foo[0]} ${#foo[0]}
288echo ${foo[1]} ${#foo[1]}
289echo ${foo[@]} ${#foo[@]}
290echo ${foo[*]} ${#foo[*]}
291
292foo=''
293echo ${foo[0]} ${#foo[0]}
294echo ${foo[1]} ${#foo[1]}
295echo ${foo[@]} ${#foo[@]}
296echo ${foo[*]} ${#foo[*]}
297
298# new expansions added after bash-2.05b
299x[0]=zero
300x[1]=one
301x[4]=four
302x[10]=ten
303
304recho ${!x[@]}
305recho "${!x[@]}"
306recho ${!x[*]}
307recho "${!x[*]}"
308
309# sparse array tests for code fixed in bash-3.0
310unset av
311av[1]='one'
312av[2]=''
313
314av[3]=three
315av[5]=five
316av[7]=seven
317
318echo include null element -- expect one
319echo ${av[@]:1:2} # what happens when we include a null element?
320echo include unset element -- expect three five
321echo ${av[@]:3:2} # what happens when we include an unset element?
322echo start at unset element -- expect five seven
323echo ${av[@]:4:2} # what happens when we start at an unset element?
324
325echo too many elements -- expect three five seven
326echo ${av[@]:3:5} # how about too many elements?
327
328echo positive offset - expect five seven
329echo ${av[@]:5:2}
330echo negative offset to unset element - expect seven
331echo ${av[@]: -2:2}
332
333echo positive offset 2 - expect seven
334echo ${av[@]: 6:2}
335echo negative offset 2 - expect seven
336echo ${av[@]: -1:2}
337
338echo out-of-range offset
339echo ${av[@]:12}
340
341# parsing problems and other inconsistencies not fixed until post bash-3.0
342unset x
343declare -a x=(')' $$)
344[ ${x[1]} -eq $$ ] || echo bad
345
346unset x
347declare -a x=(a b c d e)
348echo ${x[4]}
349
350z=([1]=one [4]=four [7]=seven [10]=ten)
351
352echo ${#z[@]}
353
354echo ${!z[@]}
355
356unset x
357declare -a x=(a \'b c\')
358
359echo "${x[1]}"
360
361unset x
362declare -a x=(a 'b c')
363
364echo "${x[1]}"
365
366unset x
367declare -a x=($0)
368[ "${x[@]}" = $0 ] || echo double expansion of \$0
369declare -a x=(\$0)
370echo "${x[@]}"
371
372: ${TMPDIR:=/tmp}
373
374mkdir $TMPDIR/bash-test-$$
375cd $TMPDIR/bash-test-$$
376
377trap "cd / ; rm -rf $TMPDIR/bash-test-$$" 0 1 2 3 6 15
378
379touch '[3]=abcde'
380
381touch r s t u v
382
383declare -a x=(*)
384
385echo ${x[3]}
386echo ${x[@]}
387
388unset x
389x=(a b c d e)
390
391echo ${x[*]: -1}
392
393unset x[4]
394unset x[2]
395
396x[9]='9'
397
398echo ${x[*]: -1}
Note: See TracBrowser for help on using the repository browser.