OILS / spec / array-literal.test.sh View on Github | oils.pub

336 lines, 216 significant
1## compare_shells: bash
2
3#### Tilde expansions in RHS of [k]=v (BashArray)
4HOME=/home/user
5a=([2]=~ [4]=~:~:~)
6echo "${a[2]}"
7echo "${a[4]}"
8## STDOUT:
9/home/user
10/home/user:/home/user:/home/user
11## END
12
13#### Tilde expansions in RHS of [k]=v (BashAssoc)
14# Note: bash-5.2 has a bug that the tilde doesn't expand on the right hand side
15# of [key]=value. This problem doesn't happen in bash-3.1..5.1 and bash-5.3.
16HOME=/home/user
17declare -A a
18declare -A a=(['home']=~ ['hello']=~:~:~)
19echo "${a['home']}"
20echo "${a['hello']}"
21## STDOUT:
22/home/user
23/home/user:/home/user:/home/user
24## END
25## BUG bash STDOUT:
26~
27~:~:~
28## END
29
30#### index increments without [k]= (BashArray)
31a=([100]=1 2 3 4)
32printf 'keys: '; argv.py "${!a[@]}"
33printf 'vals: '; argv.py "${a[@]}"
34a=([100]=1 2 3 4 [5]=a b c d)
35printf 'keys: '; argv.py "${!a[@]}"
36printf 'vals: '; argv.py "${a[@]}"
37## STDOUT:
38keys: ['100', '101', '102', '103']
39vals: ['1', '2', '3', '4']
40keys: ['5', '6', '7', '8', '100', '101', '102', '103']
41vals: ['a', 'b', 'c', 'd', '1', '2', '3', '4']
42## END
43
44#### [k]=$v and [k]="$@" (BashArray)
45i=5
46v='1 2 3'
47a=($v [i]=$v)
48printf 'keys: '; argv.py "${!a[@]}"
49printf 'vals: '; argv.py "${a[@]}"
50
51x=(3 5 7)
52a=($v [i]="${x[*]}")
53printf 'keys: '; argv.py "${!a[@]}"
54printf 'vals: '; argv.py "${a[@]}"
55a=($v [i]="${x[@]}")
56printf 'keys: '; argv.py "${!a[@]}"
57printf 'vals: '; argv.py "${a[@]}"
58a=($v [i]=${x[*]})
59printf 'keys: '; argv.py "${!a[@]}"
60printf 'vals: '; argv.py "${a[@]}"
61a=($v [i]=${x[@]})
62printf 'keys: '; argv.py "${!a[@]}"
63printf 'vals: '; argv.py "${a[@]}"
64## STDOUT:
65keys: ['0', '1', '2', '5']
66vals: ['1', '2', '3', '1 2 3']
67keys: ['0', '1', '2', '5']
68vals: ['1', '2', '3', '3 5 7']
69keys: ['0', '1', '2', '5']
70vals: ['1', '2', '3', '3 5 7']
71keys: ['0', '1', '2', '5']
72vals: ['1', '2', '3', '3 5 7']
73keys: ['0', '1', '2', '5']
74vals: ['1', '2', '3', '3 5 7']
75## END
76
77#### [k]=$v and [k]="$@" (BashAssoc)
78i=5
79v='1 2 3'
80declare -A a
81a=([i]=$v)
82printf 'keys: '; argv.py "${!a[@]}"
83printf 'vals: '; argv.py "${a[@]}"
84
85x=(3 5 7)
86a=([i]="${x[*]}")
87printf 'keys: '; argv.py "${!a[@]}"
88printf 'vals: '; argv.py "${a[@]}"
89a=([i]="${x[@]}")
90printf 'keys: '; argv.py "${!a[@]}"
91printf 'vals: '; argv.py "${a[@]}"
92a=([i]=${x[*]})
93printf 'keys: '; argv.py "${!a[@]}"
94printf 'vals: '; argv.py "${a[@]}"
95a=([i]=${x[@]})
96printf 'keys: '; argv.py "${!a[@]}"
97printf 'vals: '; argv.py "${a[@]}"
98## STDOUT:
99keys: ['i']
100vals: ['1 2 3']
101keys: ['i']
102vals: ['3 5 7']
103keys: ['i']
104vals: ['3 5 7']
105keys: ['i']
106vals: ['3 5 7']
107keys: ['i']
108vals: ['3 5 7']
109## END
110
111#### append to element (BashArray)
112hello=100
113a=([hello]=1 [hello]+=2)
114printf 'keys: '; argv.py "${!a[@]}"
115printf 'vals: '; argv.py "${a[@]}"
116a+=([hello]+=:34 [hello]+=:56)
117printf 'keys: '; argv.py "${!a[@]}"
118printf 'vals: '; argv.py "${a[@]}"
119## STDOUT:
120keys: ['100']
121vals: ['12']
122keys: ['100']
123vals: ['12:34:56']
124## END
125
126#### append to element (BashAssoc)
127declare -A a
128hello=100
129a=([hello]=1 [hello]+=2)
130printf 'keys: '; argv.py "${!a[@]}"
131printf 'vals: '; argv.py "${a[@]}"
132a+=([hello]+=:34 [hello]+=:56)
133printf 'keys: '; argv.py "${!a[@]}"
134printf 'vals: '; argv.py "${a[@]}"
135## STDOUT:
136keys: ['hello']
137vals: ['12']
138keys: ['hello']
139vals: ['12:34:56']
140## END
141# Bash >= 5.1 has a bug. Bash <= 5.0 is OK.
142## BUG bash STDOUT:
143keys: ['hello']
144vals: ['2']
145keys: ['hello']
146vals: ['2:34:56']
147## END
148
149#### non-index forms of element (BashAssoc)
150declare -A a
151a=([j]=1 2 3 4)
152echo "status=$?"
153printf 'keys: '; argv.py "${!a[@]}"
154printf 'vals: '; argv.py "${a[@]}"
155## status: 1
156## STDOUT:
157## END
158# Bash outputs warning messages and succeeds (exit status 0)
159## BUG bash status: 0
160## BUG bash STDOUT:
161status=0
162keys: ['j']
163vals: ['1']
164## END
165## BUG bash STDERR:
166bash: line 2: a: 2: must use subscript when assigning associative array
167bash: line 2: a: 3: must use subscript when assigning associative array
168bash: line 2: a: 4: must use subscript when assigning associative array
169## END
170
171#### Evaluation order (1)
172# RHS of [k]=v are expanded when the initializer list is instanciated. For the
173# indexed array, the array indices are evaluated when the array is modified.
174i=1
175a=([100+i++]=$((i++)) [200+i++]=$((i++)) [300+i++]=$((i++)))
176printf 'keys: '; argv.py "${!a[@]}"
177printf 'vals: '; argv.py "${a[@]}"
178## STDOUT:
179keys: ['104', '205', '306']
180vals: ['1', '2', '3']
181## END
182
183#### Evaluation order (2)
184# When evaluating the index, the modification to the array by the previous item
185# of the initializer list is visible to the current item.
186a=([0]=1+2+3 [a[0]]=10 [a[6]]=hello)
187printf 'keys: '; argv.py "${!a[@]}"
188printf 'vals: '; argv.py "${a[@]}"
189## STDOUT:
190keys: ['0', '6', '10']
191vals: ['1+2+3', '10', 'hello']
192## END
193
194#### Evaluation order (3)
195# RHS should be expanded before any modification to the array.
196a=(old1 old2 old3)
197a=("${a[2]}" "${a[0]}" "${a[1]}" "${a[2]}" "${a[0]}")
198printf 'keys: '; argv.py "${!a[@]}"
199printf 'vals: '; argv.py "${a[@]}"
200a=(old1 old2 old3)
201old1=101 old2=102 old3=103
202new1=201 new2=202 new3=203
203a+=([0]=new1 [1]=new2 [2]=new3 [5]="${a[2]}" [a[0]]="${a[0]}" [a[1]]="${a[1]}")
204printf 'keys: '; argv.py "${!a[@]}"
205printf 'vals: '; argv.py "${a[@]}"
206## STDOUT:
207keys: ['0', '1', '2', '3', '4']
208vals: ['old3', 'old1', 'old2', 'old3', 'old1']
209keys: ['0', '1', '2', '5', '201', '202']
210vals: ['new1', 'new2', 'new3', 'old3', 'old1', 'old2']
211## END
212
213#### [k1]=v1 (BashArray)
214# Note: This and next tests have originally been in "spec/assign.test.sh" and
215# compared the behavior of OSH's BashAssoc and Bash's indexed array. After
216# supporting "arr=([index]=value)" for indexed arrays, the test was adjusted
217# and copied here. See also the corresponding tests in "spec/assign.test.sh"
218a=([k1]=v1 [k2]=v2)
219echo ${a["k1"]}
220echo ${a["k2"]}
221## STDOUT:
222v2
223v2
224## END
225
226#### [k1]=v1 (BashAssoc)
227declare -A a
228a=([k1]=v1 [k2]=v2)
229echo ${a["k1"]}
230echo ${a["k2"]}
231## STDOUT:
232v1
233v2
234## END
235
236#### [k1]=v1 looking like brace expansions (BashAssoc)
237declare -A a
238a=([k2]=-{a,b}-)
239echo ${a["k2"]}
240## STDOUT:
241-{a,b}-
242## END
243
244#### [k1]=v1 looking like brace expansions (BashArray)
245a=([k2]=-{a,b}-)
246echo ${a["k2"]}
247## STDOUT:
248-{a,b}-
249## END
250## BUG bash STDOUT:
251[k2]=-a-
252## END
253
254#### BashArray cannot be changed to BashAssoc and vice versa
255declare -a a=(1 2 3 4)
256eval 'declare -A a=([a]=x [b]=y [c]=z)'
257echo status=$?
258argv.py "${a[@]}"
259
260declare -A A=([a]=x [b]=y [c]=z)
261eval 'declare -a A=(1 2 3 4)'
262echo status=$?
263argv.py $(printf '%s\n' "${A[@]}" | sort)
264## STDOUT:
265status=1
266['1', '2', '3', '4']
267status=1
268['x', 'y', 'z']
269## END
270
271#### (strict_array) s+=()
272case $SH in bash) ;; *) shopt --set strict_array ;; esac
273
274s1=hello
275s2=world
276
277# Overwriting Str with a new BashArray is allowed
278eval 's1=(1 2 3 4)'
279echo status=$?
280declare -p s1
281# Promoting Str to a BashArray is disallowed
282eval 's2+=(1 2 3 4)'
283echo status=$?
284declare -p s2
285## STDOUT:
286status=0
287declare -a s1=(1 2 3 4)
288status=1
289declare -- s2=world
290## END
291## N-I bash STDOUT:
292status=0
293declare -a s1=([0]="1" [1]="2" [2]="3" [3]="4")
294status=0
295declare -a s2=([0]="world" [1]="1" [2]="2" [3]="3" [4]="4")
296## END
297
298#### (strict_array) declare -A s+=()
299case $SH in bash) ;; *) shopt --set strict_array ;; esac
300
301s1=hello
302s2=world
303
304# Overwriting Str with a new BashAssoc is allowed
305eval 'declare -A s1=([a]=x [b]=y)'
306echo status=$?
307declare -p s1
308# Promoting Str to a BashAssoc is disallowed
309eval 'declare -A s2+=([a]=x [b]=y)'
310echo status=$?
311declare -p s2
312## STDOUT:
313status=0
314declare -A s1=(['a']=x ['b']=y)
315status=1
316declare -- s2=world
317## END
318## N-I bash STDOUT:
319status=0
320declare -A s1=([b]="y" [a]="x" )
321status=0
322declare -A s2=([0]="world" [b]="y" [a]="x" )
323## END
324
325#### (strict_array) assoc=(key value ...) is not allowed
326case $SH in bash) ;; *) shopt --set strict_array ;; esac
327
328declare -A a=([a]=b)
329eval "a=(1 2 3 4)"
330declare -p a
331## STDOUT:
332declare -A a=()
333## END
334## N-I bash STDOUT:
335declare -A a=([3]="4" [1]="2" )
336## END