1ac614bf3cc9756275ed2119d529cd50fcd531c3
[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 # some compound assingment parsing problems that showed up in bash-3.1-release
246 ${THIS_SH} ./array4.sub
247
248 set +u
249 cd /tmp
250
251 touch 1=bar
252 foo=([10]="bar")
253 echo ${foo[0]}
254 rm 1=bar
255
256 cd $OLDPWD
257
258 foo=(a b c d e f g)
259 echo ${foo[@]}
260
261 # quoted reserved words are ok
262 foo=(\for \case \if \then \else)
263 echo ${foo[@]}
264
265 # quoted metacharacters are ok
266 foo=( [1]='<>' [2]='<' [3]='>' [4]='!' )
267 echo ${foo[@]}
268
269 # numbers are just words when not in a redirection context
270 foo=( 12 14 16 18 20 )
271 echo ${foo[@]}
272
273 foo=( 4414758999202 )
274 echo ${foo[@]}
275
276 # this was a bug in all versions of bash 2.x up to and including bash-2.04
277 declare -a ddd=(aaa
278 bbb)
279 echo ${ddd[@]}
280
281 # errors until post-bash-2.05a; now reserved words are OK
282 foo=(a b c for case if then else)
283
284 foo=(for case if then else)
285
286 # errors
287 metas=( <> < > ! )
288 metas=( [1]=<> [2]=< [3]=> [4]=! )
289
290 # various expansions that didn't really work right until post-bash-2.04
291 foo='abc'
292 echo ${foo[0]} ${#foo[0]}
293 echo ${foo[1]} ${#foo[1]}
294 echo ${foo[@]} ${#foo[@]}
295 echo ${foo[*]} ${#foo[*]}
296
297 foo=''
298 echo ${foo[0]} ${#foo[0]}
299 echo ${foo[1]} ${#foo[1]}
300 echo ${foo[@]} ${#foo[@]}
301 echo ${foo[*]} ${#foo[*]}
302
303 # new expansions added after bash-2.05b
304 x[0]=zero
305 x[1]=one
306 x[4]=four
307 x[10]=ten
308
309 recho ${!x[@]}
310 recho "${!x[@]}"
311 recho ${!x[*]}
312 recho "${!x[*]}"
313
314 # sparse array tests for code fixed in bash-3.0
315 unset av
316 av[1]='one'
317 av[2]=''
318
319 av[3]=three
320 av[5]=five
321 av[7]=seven
322
323 echo include null element -- expect one
324 echo ${av[@]:1:2}       # what happens when we include a null element?
325 echo include unset element -- expect three five
326 echo ${av[@]:3:2}       # what happens when we include an unset element?
327 echo start at unset element -- expect five seven
328 echo ${av[@]:4:2}       # what happens when we start at an unset element?
329
330 echo too many elements -- expect three five seven
331 echo ${av[@]:3:5}       # how about too many elements?
332
333 echo positive offset - expect five seven
334 echo ${av[@]:5:2}
335 echo negative offset to unset element - expect seven
336 echo ${av[@]: -2:2}
337
338 echo positive offset 2 - expect seven
339 echo ${av[@]: 6:2}
340 echo negative offset 2 - expect seven
341 echo ${av[@]: -1:2}
342
343 echo out-of-range offset
344 echo ${av[@]:12}
345
346 # parsing problems and other inconsistencies not fixed until post bash-3.0
347 unset x
348 declare -a x=(')' $$)
349 [ ${x[1]} -eq $$ ] || echo bad
350
351 unset x
352 declare -a x=(a b c d e)
353 echo ${x[4]}
354
355 z=([1]=one [4]=four [7]=seven [10]=ten)
356
357 echo ${#z[@]}
358
359 echo ${!z[@]}
360
361 unset x
362 declare -a x=(a \'b  c\')
363
364 echo "${x[1]}"
365
366 unset x
367 declare -a x=(a 'b  c')
368
369 echo "${x[1]}"
370
371 unset x
372 declare -a x=($0)
373 [ "${x[@]}" = $0 ] || echo double expansion of \$0
374 declare -a x=(\$0)
375 echo "${x[@]}"
376
377 # tests for bash-3.1 problems
378 ${THIS_SH} ./array5.sub
379
380 # tests for post-bash-3.2 problems, most fixed in bash-3.2 patches
381 ${THIS_SH} ./array6.sub
382 ${THIS_SH} ./array7.sub
383
384 ${THIS_SH} ./array8.sub
385
386 ${THIS_SH} ./array9.sub