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