xref: /titanic_51/usr/src/lib/libshell/common/tests/arrays.sh (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
1da2e3ebdSchin########################################################################
2da2e3ebdSchin#                                                                      #
3da2e3ebdSchin#               This software is part of the ast package               #
4*3e14f97fSRoger A. Faulkner#          Copyright (c) 1982-2010 AT&T Intellectual Property          #
5da2e3ebdSchin#                      and is licensed under the                       #
6da2e3ebdSchin#                  Common Public License, Version 1.0                  #
77c2fbfb3SApril Chin#                    by AT&T Intellectual Property                     #
8da2e3ebdSchin#                                                                      #
9da2e3ebdSchin#                A copy of the License is available at                 #
10da2e3ebdSchin#            http://www.opensource.org/licenses/cpl1.0.txt             #
11da2e3ebdSchin#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
12da2e3ebdSchin#                                                                      #
13da2e3ebdSchin#              Information and Software Systems Research               #
14da2e3ebdSchin#                            AT&T Research                             #
15da2e3ebdSchin#                           Florham Park NJ                            #
16da2e3ebdSchin#                                                                      #
17da2e3ebdSchin#                  David Korn <dgk@research.att.com>                   #
18da2e3ebdSchin#                                                                      #
19da2e3ebdSchin########################################################################
20da2e3ebdSchinfunction err_exit
21da2e3ebdSchin{
22da2e3ebdSchin	print -u2 -n "\t"
23da2e3ebdSchin	print -u2 -r ${Command}[$1]: "${@:2}"
24da2e3ebdSchin	let Errors+=1
25da2e3ebdSchin}
26da2e3ebdSchinalias err_exit='err_exit $LINENO'
27da2e3ebdSchin
2834f9b3eeSRoland MainzCommand=${0##*/}
2934f9b3eeSRoland Mainzinteger Errors=0
3034f9b3eeSRoland Mainz
3134f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
3234f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT
3334f9b3eeSRoland Mainz
34da2e3ebdSchinfunction fun
35da2e3ebdSchin{
36da2e3ebdSchin	integer i
37da2e3ebdSchin	unset xxx
38da2e3ebdSchin	for i in 0 1
39da2e3ebdSchin	do	xxx[$i]=$i
40da2e3ebdSchin	done
41da2e3ebdSchin}
42da2e3ebdSchin
43da2e3ebdSchinset -A x zero one two three four 'five six'
44da2e3ebdSchinif	[[ $x != zero ]]
45da2e3ebdSchinthen	err_exit '$x is not element 0'
46da2e3ebdSchinfi
47da2e3ebdSchinif	[[ ${x[0]} != zero ]]
48da2e3ebdSchinthen	err_exit '${x[0] is not element 0'
49da2e3ebdSchinfi
50da2e3ebdSchinif	(( ${#x[0]} != 4 ))
51da2e3ebdSchinthen	err_exit "length of ${x[0]} is not 4"
52da2e3ebdSchinfi
53da2e3ebdSchinif	(( ${#x[@]} != 6  ))
54da2e3ebdSchinthen	err_exit 'number of elements of x is not 6'
55da2e3ebdSchinfi
56da2e3ebdSchinif	[[ ${x[2]} != two  ]]
57da2e3ebdSchinthen	err_exit ' element two is not 2'
58da2e3ebdSchinfi
59da2e3ebdSchinif	[[ ${x[@]:2:1} != two  ]]
60da2e3ebdSchinthen	err_exit ' ${x[@]:2:1} is not two'
61da2e3ebdSchinfi
62da2e3ebdSchinset -A y -- ${x[*]}
63da2e3ebdSchinif	[[ $y != zero ]]
64da2e3ebdSchinthen	err_exit '$x is not element 0'
65da2e3ebdSchinfi
66da2e3ebdSchinif	[[ ${y[0]} != zero ]]
67da2e3ebdSchinthen	err_exit '${y[0] is not element 0'
68da2e3ebdSchinfi
69da2e3ebdSchinif	(( ${#y[@]} != 7  ))
70da2e3ebdSchinthen	err_exit 'number of elements of y is not 7'
71da2e3ebdSchinfi
72da2e3ebdSchinif	[[ ${y[2]} != two  ]]
73da2e3ebdSchinthen	err_exit ' element two is not 2'
74da2e3ebdSchinfi
75da2e3ebdSchinset +A y nine ten
76da2e3ebdSchinif	[[ ${y[2]} != two  ]]
77da2e3ebdSchinthen	err_exit ' element two is not 2'
78da2e3ebdSchinfi
79da2e3ebdSchinif	[[ ${y[0]} != nine ]]
80da2e3ebdSchinthen	err_exit '${y[0] is not nine'
81da2e3ebdSchinfi
82da2e3ebdSchinunset y[4]
83da2e3ebdSchinif	(( ${#y[@]} != 6  ))
84da2e3ebdSchinthen	err_exit 'number of elements of y is not 6'
85da2e3ebdSchinfi
86da2e3ebdSchinif	(( ${#y[4]} != 0  ))
87da2e3ebdSchinthen	err_exit 'string length of unset element is not 0'
88da2e3ebdSchinfi
89da2e3ebdSchinunset foo
90da2e3ebdSchinif	(( ${#foo[@]} != 0  ))
91da2e3ebdSchinthen	err_exit 'number of elements of unset variable foo is not 0'
92da2e3ebdSchinfi
93da2e3ebdSchinfoo=''
94da2e3ebdSchinif	(( ${#foo[0]} != 0  ))
95da2e3ebdSchinthen	err_exit 'string length of null element is not 0'
96da2e3ebdSchinfi
97da2e3ebdSchinif	(( ${#foo[@]} != 1  ))
98da2e3ebdSchinthen	err_exit 'number of elements of null variable foo is not 1'
99da2e3ebdSchinfi
100da2e3ebdSchinunset foo
101da2e3ebdSchinfoo[0]=foo
102da2e3ebdSchinfoo[3]=bar
103da2e3ebdSchinunset foo[0]
104da2e3ebdSchinunset foo[3]
105da2e3ebdSchinif	(( ${#foo[@]} != 0  ))
106da2e3ebdSchinthen	err_exit 'number of elements of left in variable foo is not 0'
107da2e3ebdSchinfi
108da2e3ebdSchinunset foo
109da2e3ebdSchinfoo[3]=bar
110da2e3ebdSchinfoo[0]=foo
111da2e3ebdSchinunset foo[3]
112da2e3ebdSchinunset foo[0]
113da2e3ebdSchinif	(( ${#foo[@]} != 0  ))
114da2e3ebdSchinthen	err_exit 'number of elements of left in variable foo again is not 0'
115da2e3ebdSchinfi
116da2e3ebdSchinfun
117da2e3ebdSchinif	(( ${#xxx[@]} != 2  ))
118da2e3ebdSchinthen	err_exit 'number of elements of left in variable xxx is not 2'
119da2e3ebdSchinfi
120da2e3ebdSchinfun
121da2e3ebdSchinif	(( ${#xxx[@]} != 2  ))
122da2e3ebdSchinthen	err_exit 'number of elements of left in variable xxx again is not 2'
123da2e3ebdSchinfi
124da2e3ebdSchinset -A foo -- "${x[@]}"
125da2e3ebdSchinif	(( ${#foo[@]} != 6  ))
126da2e3ebdSchinthen	err_exit 'number of elements of foo is not 6'
127da2e3ebdSchinfi
128da2e3ebdSchinif	(( ${#PWD[@]} != 1  ))
129da2e3ebdSchinthen	err_exit 'number of elements of PWD is not 1'
130da2e3ebdSchinfi
131da2e3ebdSchinunset x
132da2e3ebdSchinx[2]=foo x[4]=bar
133da2e3ebdSchinif	(( ${#x[@]} != 2  ))
134da2e3ebdSchinthen	err_exit 'number of elements of x is not 2'
135da2e3ebdSchinfi
136da2e3ebdSchins[1]=1 c[1]=foo
137da2e3ebdSchinif	[[ ${c[s[1]]} != foo ]]
138da2e3ebdSchinthen	err_exit 'c[1]=foo s[1]=1; ${c[s[1]]} != foo'
139da2e3ebdSchinfi
140da2e3ebdSchinunset s
141da2e3ebdSchintypeset -Ai s
142da2e3ebdSchiny=* z=[
143da2e3ebdSchins[$y]=1
144da2e3ebdSchins[$z]=2
145da2e3ebdSchinif	(( ${#s[@]} != 2  ))
146da2e3ebdSchinthen	err_exit 'number of elements of  is not 2'
147da2e3ebdSchinfi
148da2e3ebdSchin(( s[$z] = s[$z] + ${s[$y]} ))
149da2e3ebdSchinif	[[ ${s[$z]} != 3  ]]
150da2e3ebdSchinthen	err_exit '[[ ${s[$z]} != 3  ]]'
151da2e3ebdSchinfi
152da2e3ebdSchinif	(( s[$z] != 3 ))
153da2e3ebdSchinthen	err_exit '(( s[$z] != 3 ))'
154da2e3ebdSchinfi
155da2e3ebdSchin(( s[$y] = s[$y] + ${s[$z]} ))
156da2e3ebdSchinif	[[ ${s[$y]} != 4  ]]
157da2e3ebdSchinthen	err_exit '[[ ${s[$y]} != 4  ]]'
158da2e3ebdSchinfi
159da2e3ebdSchinif	(( s[$y] != 4 ))
160da2e3ebdSchinthen	err_exit '(( s[$y] != 4 ))'
161da2e3ebdSchinfi
162da2e3ebdSchinset -A y 2 4 6
163da2e3ebdSchintypeset -i y
164da2e3ebdSchinz=${y[@]}
165da2e3ebdSchintypeset -R12 y
166da2e3ebdSchintypeset -i y
167da2e3ebdSchinif      [[ ${y[@]} != "$z" ]]
168da2e3ebdSchinthen    err_exit 'error in array conversion from int to R12'
169da2e3ebdSchinfi
170da2e3ebdSchinif      (( ${#y[@]} != 3  ))
171da2e3ebdSchinthen    err_exit 'error in count of array conversion from int to R12'
172da2e3ebdSchinfi
173da2e3ebdSchinunset abcdefg
174da2e3ebdSchin:  ${abcdefg[1]}
175da2e3ebdSchinset | grep '^abcdefg$' >/dev/null && err_exit 'empty array variable in set list'
176da2e3ebdSchinunset x y
177da2e3ebdSchinx=1
178da2e3ebdSchintypeset -i y[$x]=4
179da2e3ebdSchinif	[[ ${y[1]} != 4 ]]
180da2e3ebdSchinthen    err_exit 'arithmetic expressions in typeset not working'
181da2e3ebdSchinfi
182da2e3ebdSchinunset foo
183da2e3ebdSchintypeset foo=bar
184da2e3ebdSchintypeset -A foo
185da2e3ebdSchinif	[[ ${foo[0]} != bar ]]
186da2e3ebdSchinthen	err_exit 'initial value not preserved when typecast to associative'
187da2e3ebdSchinfi
188da2e3ebdSchinunset foo
189da2e3ebdSchinfoo=(one two)
190da2e3ebdSchintypeset -A foo
191da2e3ebdSchinfoo[two]=3
192da2e3ebdSchinif	[[ ${#foo[*]} != 3 ]]
193da2e3ebdSchinthen	err_exit 'conversion of indexed to associative array failed'
194da2e3ebdSchinfi
195da2e3ebdSchinset a b c d e f g h i j k l m
196da2e3ebdSchinif	[[ ${#} != 13 ]]
197da2e3ebdSchinthen	err_exit '${#} not 13'
198da2e3ebdSchinfi
199da2e3ebdSchinunset xxx
200da2e3ebdSchinxxx=foo
201da2e3ebdSchinif	[[ ${!xxx[@]} != 0 ]]
202da2e3ebdSchinthen	err_exit '${!xxx[@]} for scalar not 0'
203da2e3ebdSchinfi
204da2e3ebdSchinif	[[ ${11} != k ]]
205da2e3ebdSchinthen	err_exit '${11} not working'
206da2e3ebdSchinfi
207da2e3ebdSchinif	[[ ${@:4:1} != d ]]
208da2e3ebdSchinthen	err_exit '${@:4:1} not working'
209da2e3ebdSchinfi
210da2e3ebdSchinfoovar1=abc
211da2e3ebdSchinfoovar2=def
212da2e3ebdSchinif	[[ ${!foovar@} != +(foovar[[:alnum:]]?([ ])) ]]
213da2e3ebdSchinthen	err_exit '${!foovar@} does not expand correctly'
214da2e3ebdSchinfi
215da2e3ebdSchinif	[[ ${!foovar1} != foovar1 ]]
216da2e3ebdSchinthen	err_exit '${!foovar1} != foovar1'
217da2e3ebdSchinfi
218da2e3ebdSchinunset xxx
219da2e3ebdSchin: ${xxx[3]}
220da2e3ebdSchinif	[[ ${!xxx[@]} ]]
221da2e3ebdSchinthen	err_exit '${!xxx[@]} should be null'
222da2e3ebdSchinfi
223da2e3ebdSchininteger i=0
224da2e3ebdSchin{
225da2e3ebdSchin	set -x
226da2e3ebdSchin	xxx[++i]=1
227da2e3ebdSchin	set +x
228da2e3ebdSchin} 2> /dev/null
229da2e3ebdSchinif	(( i != 1))
230da2e3ebdSchinthen	err_exit 'execution trace side effects with array subscripts'
231da2e3ebdSchinfi
232da2e3ebdSchinunset list
233da2e3ebdSchin: $(set -A list foo bar)
234da2e3ebdSchinif	(( ${#list[@]} != 0))
235da2e3ebdSchinthen	err_exit '$(set -A list ...) leaves side effects'
236da2e3ebdSchinfi
237da2e3ebdSchinunset list
238da2e3ebdSchinlist= (foo bar bam)
239da2e3ebdSchin( set -A list one two three four)
240da2e3ebdSchinif	[[ ${list[1]} != bar ]]
241da2e3ebdSchinthen	err_exit 'array not restored after subshell'
242da2e3ebdSchinfi
243da2e3ebdSchinXPATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:.:/sbin:/usr/sbin
244da2e3ebdSchinxpath=( $( IFS=: ; echo $XPATH ) )
245da2e3ebdSchinif	[[ $(print -r  "${xpath[@]##*/}") != 'bin bin ucb bin . sbin sbin' ]]
246da2e3ebdSchinthen	err_exit '${xpath[@]##*/} not applied to each element'
247da2e3ebdSchinfi
248da2e3ebdSchinfoo=( zero one '' three four '' six)
249da2e3ebdSchininteger n=-1
250da2e3ebdSchinif	[[ ${foo[@]:n} != six ]]
251da2e3ebdSchinthen	err_exit 'array offset of -1 not working'
252da2e3ebdSchinfi
253da2e3ebdSchinif	[[ ${foo[@]: -3:1} != four ]]
254da2e3ebdSchinthen	err_exit 'array offset of -3:1 not working'
255da2e3ebdSchinfi
256da2e3ebdSchin$SHELL -c 'x=(if then else fi)' 2> /dev/null  || err_exit 'reserved words in x=() assignment not working'
257da2e3ebdSchinunset foo
258da2e3ebdSchinfoo=one
259da2e3ebdSchinfoo=( $foo two)
260da2e3ebdSchinif	[[ ${#foo[@]} != 2 ]]
261da2e3ebdSchinthen	err_exit 'array getting unset before right hand side evaluation'
262da2e3ebdSchinfi
263da2e3ebdSchinfoo=(143 3643 38732)
264da2e3ebdSchinexport foo
265da2e3ebdSchintypeset -i foo
266da2e3ebdSchinif	[[ $($SHELL -c 'print $foo') != 143 ]]
267da2e3ebdSchinthen	err_exit 'exporting indexed array not exporting 0-th element'
268da2e3ebdSchinfi
269da2e3ebdSchin( $SHELL   -c '
270da2e3ebdSchin	unset foo
271da2e3ebdSchin	typeset -A foo=([0]=143 [1]=3643 [2]=38732)
272da2e3ebdSchin	export foo
273da2e3ebdSchin	typeset -i foo
274da2e3ebdSchin	[[ $($SHELL -c "print $foo") == 143 ]]'
275da2e3ebdSchin) 2> /dev/null ||
276da2e3ebdSchin		err_exit 'exporting associative array not exporting 0-th element'
277da2e3ebdSchinunset foo
278da2e3ebdSchintypeset -A foo
279da2e3ebdSchinfoo[$((10))]=ok 2> /dev/null || err_exit 'arithmetic expression as subscript not working'
280da2e3ebdSchinunset foo
281da2e3ebdSchintypeset -A foo
282da2e3ebdSchininteger foo=0
283da2e3ebdSchin[[ $foo == 0 ]] || err_exit 'zero element of associative array not being set'
284da2e3ebdSchinunset foo
285da2e3ebdSchintypeset -A foo=( [two]=1)
286da2e3ebdSchinfor i in one three four five
287da2e3ebdSchindo	: ${foo[$i]}
288da2e3ebdSchindone
289da2e3ebdSchinif	[[ ${!foo[@]} != two ]]
29034f9b3eeSRoland Mainzthen	err_exit 'error in subscript names'
291da2e3ebdSchinfi
292da2e3ebdSchinunset x
293da2e3ebdSchinx=( 1 2 3)
294da2e3ebdSchin(x[1]=8)
295da2e3ebdSchin[[ ${x[1]} == 2 ]] || err_exit 'index array produce side effects in subshells'
296da2e3ebdSchinx=( 1 2 3)
297da2e3ebdSchin(
298da2e3ebdSchin	x+=(8)
299da2e3ebdSchin	[[ ${#x[@]} == 4 ]] || err_exit 'index array append in subshell error'
300da2e3ebdSchin)
301da2e3ebdSchin[[ ${#x[@]} == 3 ]] || err_exit 'index array append in subshell effects parent'
302da2e3ebdSchinx=( [one]=1 [two]=2 [three]=3)
303da2e3ebdSchin(x[two]=8)
304da2e3ebdSchin[[ ${x[two]} == 2 ]] || err_exit 'associative array produce side effects in subshells'
305da2e3ebdSchinunset x
306da2e3ebdSchinx=( [one]=1 [two]=2 [three]=3)
307da2e3ebdSchin(
308da2e3ebdSchin	x+=( [four]=4 )
309da2e3ebdSchin	[[ ${#x[@]} == 4 ]] || err_exit 'associative array append in subshell error'
310da2e3ebdSchin)
311da2e3ebdSchin[[ ${#x[@]} == 3 ]] || err_exit 'associative array append in subshell effects parent'
312da2e3ebdSchinunset x
313da2e3ebdSchininteger i
314da2e3ebdSchinfor ((i=0; i < 40; i++))
315da2e3ebdSchindo	x[i]=$i
316da2e3ebdSchindone
317da2e3ebdSchin[[  ${#x[@]} == 40 ]] || err_exit 'index arrays loosing values'
318da2e3ebdSchin[[ $( ($SHELL -c 'typeset -A var; (IFS=: ; set -A var a:b:c ;print ${var[@]});:' )2>/dev/null) == 'a b c' ]] || err_exit 'change associative to index failed'
319da2e3ebdSchinunset foo
320da2e3ebdSchin[[ $(foo=good
321da2e3ebdSchinfor ((i=0; i < 2; i++))
322da2e3ebdSchindo	[[ ${foo[i]} ]] && print ok
323da2e3ebdSchindone) == ok ]] || err_exit 'invalid optimization for subscripted variables'
324da2e3ebdSchin(
325da2e3ebdSchinx=([foo]=bar)
326da2e3ebdSchinset +A x bam
327da2e3ebdSchin) 2> /dev/null && err_exit 'set +A with associative array should be an error'
328da2e3ebdSchinunset bam foo
329da2e3ebdSchinfoo=0
330da2e3ebdSchintypeset -A bam
331da2e3ebdSchinunset bam[foo]
332da2e3ebdSchinbam[foo]=value
333da2e3ebdSchin[[ $bam == value ]] && err_exit 'unset associative array element error'
334da2e3ebdSchin: only first element of an array can be exported
335da2e3ebdSchinunset bam
33634f9b3eeSRoland Mainzprint 'print ${var[0]} ${var[1]}' > $tmp/script
33734f9b3eeSRoland Mainzchmod +x $tmp/script
33834f9b3eeSRoland Mainz[[ $($SHELL -c "var=(foo bar);export var;$tmp/script") == foo ]] || err_exit 'export array not exporting just first element'
339*3e14f97fSRoger A. Faulkner
340da2e3ebdSchinunset foo
341*3e14f97fSRoger A. Faulknerset --allexport
342da2e3ebdSchinfoo=one
343da2e3ebdSchinfoo[1]=two
344da2e3ebdSchinfoo[0]=three
345*3e14f97fSRoger A. Faulkner[[ $foo == three ]] || err_exit '--allexport not working with arrays'
346*3e14f97fSRoger A. Faulknerset --noallexport
347*3e14f97fSRoger A. Faulknerunset foo
348*3e14f97fSRoger A. Faulkner
34934f9b3eeSRoland Mainzcat > $tmp/script <<- \!
350da2e3ebdSchin	typeset -A foo
351da2e3ebdSchin	print foo${foo[abc]}
352da2e3ebdSchin!
35334f9b3eeSRoland Mainz[[ $($SHELL -c "typeset -A foo;$tmp/script")  == foo ]] 2> /dev/null || err_exit 'empty associative arrays not being cleared correctly before scripts'
35434f9b3eeSRoland Mainz[[ $($SHELL -c "typeset -A foo;foo[abc]=abc;$tmp/script") == foo ]] 2> /dev/null || err_exit 'associative arrays not being cleared correctly before scripts'
355da2e3ebdSchinunset foo
356da2e3ebdSchinfoo=(one two)
357da2e3ebdSchin[[ ${foo[@]:1} == two ]] || err_exit '${foo[@]:1} == two'
358da2e3ebdSchin[[ ! ${foo[@]:2} ]] || err_exit '${foo[@]:2} not null'
359da2e3ebdSchinunset foo
360da2e3ebdSchinfoo=one
361da2e3ebdSchin[[ ! ${foo[@]:1} ]] || err_exit '${foo[@]:1} not null'
362da2e3ebdSchinfunction EMPTY
363da2e3ebdSchin{
364da2e3ebdSchin        typeset i
365da2e3ebdSchin        typeset -n ARRAY=$1
366da2e3ebdSchin        for i in ${!ARRAY[@]}
367da2e3ebdSchin        do      unset ARRAY[$i]
368da2e3ebdSchin        done
369da2e3ebdSchin}
370da2e3ebdSchinunset foo
371da2e3ebdSchintypeset -A foo
372da2e3ebdSchinfoo[bar]=bam
373da2e3ebdSchinfoo[x]=y
374da2e3ebdSchinEMPTY foo
375da2e3ebdSchin[[ $(typeset | grep foo$) == *associative* ]] || err_exit 'array lost associative attribute'
376da2e3ebdSchin[[ ! ${foo[@]}  ]] || err_exit 'array not empty'
377da2e3ebdSchin[[ ! ${!foo[@]}  ]] || err_exit 'array names not empty'
378da2e3ebdSchinunset foo
379da2e3ebdSchinfoo=bar
380da2e3ebdSchinset -- "${foo[@]:1}"
381da2e3ebdSchin(( $# == 0 )) || err_exit '${foo[@]:1} should not have any values'
382da2e3ebdSchinunset bar
383*3e14f97fSRoger A. Faulknerexp=4
384da2e3ebdSchin: ${_foo[bar=4]}
385*3e14f97fSRoger A. Faulkner(( bar == 4 )) || err_exit "subscript of unset variable not evaluated -- expected '4', got '$got'"
386*3e14f97fSRoger A. Faulknerunset bar
387*3e14f97fSRoger A. Faulkner: ${_foo[bar=$exp]}
388*3e14f97fSRoger A. Faulkner(( bar == $exp )) || err_exit "subscript of unset variable not evaluated -- expected '$exp', got '$got'"
3897c2fbfb3SApril Chinunset foo bar
3907c2fbfb3SApril Chinfoo[5]=4
3917c2fbfb3SApril Chinbar[4]=3
3927c2fbfb3SApril Chinbar[0]=foo
3937c2fbfb3SApril Chinfoo[0]=bam
3947c2fbfb3SApril Chinfoo[4]=5
3957c2fbfb3SApril Chin[[ ${!foo[2+2]} == 'foo[4]' ]] || err_exit '${!var[sub]} should be var[sub]'
3967c2fbfb3SApril Chin[[ ${bar[${foo[5]}]} == 3 ]] || err_exit  'array subscript cannot be an array instance'
3977c2fbfb3SApril Chin[[ $bar[4] == 3 ]] || err_exit '$bar[x] != ${bar[x]} inside [[ ]]'
3987c2fbfb3SApril Chin(( $bar[4] == 3  )) || err_exit '$bar[x] != ${bar[x]} inside (( ))'
3997c2fbfb3SApril Chin[[ $bar[$foo[5]] == 3 ]]  || err_exit '$bar[foo[x]] != ${bar[foo[x]]} inside [[ ]]'
4007c2fbfb3SApril Chin(( $bar[$foo[5]] == 3  )) || err_exit '$bar[foo[x]] != ${bar[foo[x]]} inside (( ))'
4017c2fbfb3SApril Chinx=$bar[4]
4027c2fbfb3SApril Chin[[ $x == 4 ]] && err_exit '$bar[4] should not be an array in an assignment'
4037c2fbfb3SApril Chinx=${bar[$foo[5]]}
4047c2fbfb3SApril Chin(( $x == 3 )) || err_exit '${bar[$foo[sub]]} not working'
4057c2fbfb3SApril Chin[[ $($SHELL  <<- \++EOF+++
4067c2fbfb3SApril Chin	typeset -i test_variable=0
4077c2fbfb3SApril Chin	typeset -A test_array
4087c2fbfb3SApril Chin	test_array[1]=100
4097c2fbfb3SApril Chin	read test_array[2] <<-!
4107c2fbfb3SApril Chin	2
4117c2fbfb3SApril Chin	!
4127c2fbfb3SApril Chin	read test_array[3] <<-!
4137c2fbfb3SApril Chin	3
4147c2fbfb3SApril Chin	!
4157c2fbfb3SApril Chin	test_array[3]=4
4167c2fbfb3SApril Chin	print "val=${test_array[3]}"
4177c2fbfb3SApril Chin++EOF+++
4187c2fbfb3SApril Chin) == val=4 ]] 2> /dev/null || err_exit 'after reading array[j] and assign array[j] fails'
4197c2fbfb3SApril Chin[[ $($SHELL <<- \+++EOF+++
4207c2fbfb3SApril Chin	pastebin=( typeset -a form)
4217c2fbfb3SApril Chin	pastebin.form+=( name="name"   data="clueless" )
4227c2fbfb3SApril Chin	print -r -- ${pastebin.form[0].name}
4237c2fbfb3SApril Chin+++EOF+++
4247c2fbfb3SApril Chin) == name ]] 2> /dev/null ||  err_exit 'indexed array in compound variable not working'
4257c2fbfb3SApril Chinunset foo bar
4267c2fbfb3SApril Chin: ${foo[bar=2]}
4277c2fbfb3SApril Chin[[ $bar == 2 ]] || err_exit 'subscript not evaluated for unset variable'
4287c2fbfb3SApril Chinunset foo bar
4297c2fbfb3SApril Chinbar=1
4307c2fbfb3SApril Chintypeset -a foo=([1]=ok [2]=no)
4317c2fbfb3SApril Chin[[ $foo[bar] == ok ]] || err_exit 'typeset -a not working for simple assignment'
4327c2fbfb3SApril Chinunset foo
4337c2fbfb3SApril Chintypeset -a foo=([1]=(x=ok) [2]=(x=no))
4347c2fbfb3SApril Chin[[ $(typeset | grep 'foo$') == *index* ]] || err_exit 'typeset -a not creating an indexed array'
4357c2fbfb3SApril Chinfoo+=([5]=good)
4367c2fbfb3SApril Chin[[ $(typeset | grep 'foo$') == *index* ]] || err_exit 'append to indexed array not preserving array type'
4377c2fbfb3SApril Chinunset foo
4387c2fbfb3SApril Chintypeset -A foo=([1]=ok [2]=no)
4397c2fbfb3SApril Chin[[ $foo[bar] == ok ]] && err_exit 'typeset -A not working for simple assignment'
4407c2fbfb3SApril Chinunset foo
4417c2fbfb3SApril Chintypeset -A foo=([1]=(x=ok) [2]=(x=no))
4427c2fbfb3SApril Chin[[ ${foo[bar].x} == ok ]] && err_exit 'typeset -A not working for compound assignment'
4437c2fbfb3SApril Chin[[ $($SHELL -c 'typeset -a foo;typeset | grep "foo$"'  2> /dev/null) == *index* ]] || err_exit 'typeset fails for indexed array with no elements'
4447c2fbfb3SApril Chinxxxxx=(one)
4457c2fbfb3SApril Chin[[ $(typeset | grep xxxxx$) == *'indexed array'* ]] || err_exit 'array of one element not an indexed array'
4467c2fbfb3SApril Chinunset foo
4477c2fbfb3SApril Chinfoo[1]=(x=3 y=4)
4487c2fbfb3SApril Chin{ [[ ${!foo[1].*} == 'foo[1].x foo[1].y' ]] ;} 2> /dev/null || err_exit '${!foo[sub].*} not expanding correctly'
4497c2fbfb3SApril Chinunset x
4507c2fbfb3SApril Chinx=( typeset -a foo=( [0]="a" [1]="b" [2]="c" ))
4517c2fbfb3SApril Chin[[  ${@x.foo} == 'typeset -a'* ]] || err_exit 'x.foo is not an indexed array'
4527c2fbfb3SApril Chinx=( typeset -A foo=( [0]="a" [1]="b" [2]="c" ))
4537c2fbfb3SApril Chin[[  ${@x.foo} == 'typeset -A'* ]] || err_exit 'x.foo is not an associative array'
4547c2fbfb3SApril Chin$SHELL -c $'x=(foo\n\tbar\nbam\n)' 2> /dev/null || err_exit 'compound array assignment with new-lines not working'
4557c2fbfb3SApril Chin$SHELL -c $'x=(foo\n\tbar:\nbam\n)' 2> /dev/null || err_exit 'compound array assignment with labels not working'
4567c2fbfb3SApril Chin$SHELL -c $'x=(foo\n\tdone\nbam\n)' 2> /dev/null || err_exit 'compound array assignment with reserved words not working'
4577c2fbfb3SApril Chin[[ $($SHELL -c 'typeset -A A; print $(( A[foo].bar ))' 2> /dev/null) == 0 ]] || err_exit 'unset variable not evaluating to 0'
4587c2fbfb3SApril Chinunset a
4597c2fbfb3SApril Chintypeset -A a
4607c2fbfb3SApril China[a].z=1
4617c2fbfb3SApril China[z].z=2
4627c2fbfb3SApril Chinunset a[a]
4637c2fbfb3SApril Chin[[ ${!a[@]} == z ]] || err_exit '"unset a[a]" unsets entire array'
4647c2fbfb3SApril Chinunset a
4657c2fbfb3SApril China=([x]=1 [y]=2 [z]=(foo=3 bar=4))
4667c2fbfb3SApril Chineval "b=$(printf "%B\n" a)"
4677c2fbfb3SApril Chineval "c=$(printf "%#B\n" a)"
4687c2fbfb3SApril Chin[[ ${a[*]} == "${b[*]}" ]] || err_exit 'printf %B not preserving values for arrays'
4697c2fbfb3SApril Chin[[ ${a[*]} == "${c[*]}" ]] || err_exit 'printf %#B not preserving values for arrays'
4707c2fbfb3SApril Chinunset a
4717c2fbfb3SApril China=(zero one two three four)
4727c2fbfb3SApril China[6]=six
4737c2fbfb3SApril Chin[[ ${a[-1]} == six ]] || err_exit 'a[-1] should be six'
4747c2fbfb3SApril Chin[[ ${a[-3]} == four ]] || err_exit 'a[-3] should be four'
4757c2fbfb3SApril Chin[[ ${a[-3..-1]} == 'four six' ]] || err_exit "a[-3,-1] should be 'four six'"
47634f9b3eeSRoland Mainz
47734f9b3eeSRoland MainzFILTER=(typeset scope)
47834f9b3eeSRoland MainzFILTER[0].scope=include
47934f9b3eeSRoland MainzFILTER[1].scope=exclude
48034f9b3eeSRoland Mainz[[ ${#FILTER[@]} == 2 ]] ||  err_exit "FILTER array should have two elements not ${#FILTER[@]}"
48134f9b3eeSRoland Mainz
482*3e14f97fSRoger A. Faulknerunset x
483*3e14f97fSRoger A. Faulknerfunction x.get
484*3e14f97fSRoger A. Faulkner{
485*3e14f97fSRoger A. Faulkner	print sub=${.sh.subscript}
486*3e14f97fSRoger A. Faulkner}
487*3e14f97fSRoger A. Faulknerx[2]=
488*3e14f97fSRoger A. Faulknerz=$(: ${x[1]} )
489*3e14f97fSRoger A. Faulkner[[ $z == sub=1 ]] || err_exit 'get function not invoked for index array'
490*3e14f97fSRoger A. Faulkner
491*3e14f97fSRoger A. Faulknerunset x
492*3e14f97fSRoger A. Faulknertypeset -A x
493*3e14f97fSRoger A. Faulknerfunction x.get
494*3e14f97fSRoger A. Faulkner{
495*3e14f97fSRoger A. Faulkner	print sub=${.sh.subscript}
496*3e14f97fSRoger A. Faulkner}
497*3e14f97fSRoger A. Faulknerx[2]=
498*3e14f97fSRoger A. Faulknerz=$(: ${x[1]} )
499*3e14f97fSRoger A. Faulkner[[ $z == sub=1 ]] || err_exit 'get function not invoked for associative array'
500*3e14f97fSRoger A. Faulkner
501da2e3ebdSchinexit $((Errors))
502