source: vendor/bash/3.1/tests/array.tests@ 3228

Last change on this file since 3228 was 3228, checked in by bird, 19 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