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

376 lines, 189 significant
1## compare_shells: bash zsh mksh ash
2## oils_failures_allowed: 9
3
4# Note: this file elaborates on spec/ble-idioms.test.sh
5
6#### Indexed LHS without spaces, and +=
7a[1]=x
8echo status=$?
9argv.py "${a[@]}"
10
11a[0+2]=y
12#a[2|3]=y # zsh doesn't allow this
13argv.py "${a[@]}"
14
15# += does appending
16a[0+2]+=z
17argv.py "${a[@]}"
18
19## STDOUT:
20status=0
21['x']
22['x', 'y']
23['x', 'yz']
24## END
25
26## N-I ash status: 2
27## N-I ash STDOUT:
28status=127
29## END
30
31#### Indexed LHS with spaces
32case $SH in zsh|ash) exit ;; esac
33
34a[1 * 1]=x
35a[ 1 + 2 ]=z
36echo status=$?
37
38argv.py "${a[@]}"
39## STDOUT:
40status=0
41['x', 'z']
42## END
43## N-I zsh/ash STDOUT:
44## END
45
46#### Nested a[i[0]]=0
47case $SH in zsh|ash) exit ;; esac
48
49i=(0 1 2)
50
51a[i[0]]=0
52a[ i[1] ]=1
53a[ i[2] ]=2
54a[ i[1]+i[2] ]=3
55
56argv.py "${a[@]}"
57
58## STDOUT:
59['0', '1', '2', '3']
60## END
61## N-I zsh/ash STDOUT:
62## END
63
64#### Multiple LHS array words
65case $SH in zsh|ash) exit ;; esac
66
67a=(0 1 2)
68b=(3 4 5)
69
70#declare -p a b
71
72HOME=/home/spec-test
73
74# empty string, and tilde sub
75a[0 + 1]= b[2 + 0]=~/src
76
77typeset -p a b
78
79echo ---
80
81# In bash, this bad prefix binding prints an error, but nothing fails
82a[0 + 1]='foo' argv.py b[2 + 0]='bar'
83echo status=$?
84
85typeset -p a b
86
87## STDOUT:
88declare -a a=([0]="0" [1]="" [2]="2")
89declare -a b=([0]="3" [1]="4" [2]="/home/spec-test/src")
90---
91['b[2', '+', '0]=bar']
92status=0
93declare -a a=([0]="0" [1]="" [2]="2")
94declare -a b=([0]="3" [1]="4" [2]="/home/spec-test/src")
95## END
96
97## OK mksh STDOUT:
98set -A a
99typeset a[0]=0
100typeset a[1]=
101typeset a[2]=2
102set -A b
103typeset b[0]=3
104typeset b[1]=4
105typeset b[2]=/home/spec-test/src
106---
107['b[2', '+', '0]=bar']
108status=0
109set -A a
110typeset a[0]=0
111typeset a[1]=
112typeset a[2]=2
113set -A b
114typeset b[0]=3
115typeset b[1]=4
116typeset b[2]=/home/spec-test/src
117## END
118
119## N-I zsh/ash STDOUT:
120## END
121
122#### LHS array is protected with shopt -s eval_unsafe_arith, e.g. 'a[$(echo 2)]'
123case $SH in zsh|ash) exit ;; esac
124
125a=(0 1 2)
126b=(3 4 5)
127typeset -p b
128
129expr='a[$(echo 2)]'
130
131echo 'get' "${b[expr]}"
132
133b[expr]=zzz
134
135echo 'set' "${b[expr]}"
136typeset -p b
137
138## STDOUT:
139declare -a b=([0]="3" [1]="4" [2]="5")
140get 5
141set zzz
142declare -a b=([0]="3" [1]="4" [2]="zzz")
143## END
144
145## OK mksh STDOUT:
146set -A b
147typeset b[0]=3
148typeset b[1]=4
149typeset b[2]=5
150get 5
151set zzz
152set -A b
153typeset b[0]=3
154typeset b[1]=4
155typeset b[2]=zzz
156## END
157
158## N-I zsh/ash STDOUT:
159## END
160
161#### file named a[ is not executed
162case $SH in zsh|ash) exit ;; esac
163
164PATH=".:$PATH"
165
166for name in 'a[' 'a[5'; do
167 echo "echo hi from $name: \$# args: \$@" > "$name"
168 chmod +x "$name"
169done
170
171# this does not executed a[5
172a[5 + 1]=
173a[5 / 1]=y
174echo len=${#a[@]}
175
176# Not detected as assignment because there's a non-arith character
177# bash and mksh both give a syntax error
178a[5 # 1]=
179
180## status: 1
181## STDOUT:
182len=2
183## END
184
185## N-I zsh/ash status: 0
186## N-I zsh/ash STDOUT:
187## END
188
189#### More fragments like a[ a[5 a[5 + a[5 + 3]
190
191for name in 'a[' 'a[5'; do
192 echo "echo hi from $name: \$# args: \$@" > "$name"
193 chmod +x "$name"
194done
195
196# syntax error in bash
197$SH -c 'a['
198echo "a[ status=$?"
199
200$SH -c 'a[5'
201echo "a[5 status=$?"
202
203# 1 arg +
204$SH -c 'a[5 +'
205echo "a[5 + status=$?"
206
207# 2 args
208$SH -c 'a[5 + 3]'
209echo "a[5 + 3] status=$?"
210
211$SH -c 'a[5 + 3]='
212echo "a[5 + 3]= status=$?"
213
214$SH -c 'a[5 + 3]+'
215echo "a[5 + 3]+ status=$?"
216
217$SH -c 'a[5 + 3]+='
218echo "a[5 + 3]+= status=$?"
219
220# mksh doesn't issue extra parse errors
221# and it doesn't turn a[5 + 3] and a[5 + 3]+ into commands!
222
223## STDOUT:
224a[ status=127
225a[5 status=127
226a[5 + status=127
227a[5 + 3] status=127
228a[5 + 3]= status=0
229a[5 + 3]+ status=127
230a[5 + 3]+= status=0
231## END
232
233## BUG bash STDOUT:
234a[ status=2
235a[5 status=2
236a[5 + status=2
237a[5 + 3] status=127
238a[5 + 3]= status=0
239a[5 + 3]+ status=127
240a[5 + 3]+= status=0
241## END
242
243# in zsh, everything becomes "bad pattern"
244
245## BUG-2 zsh STDOUT:
246a[ status=1
247a[5 status=1
248a[5 + status=1
249a[5 + 3] status=1
250a[5 + 3]= status=1
251a[5 + 3]+ status=1
252a[5 + 3]+= status=1
253## END
254
255# ash behavior is consistent
256
257## N-I ash STDOUT:
258a[ status=127
259a[5 status=127
260a[5 + status=127
261a[5 + 3] status=127
262a[5 + 3]= status=127
263a[5 + 3]+ status=127
264a[5 + 3]+= status=127
265## END
266
267#### Are quotes allowed?
268
269# double quotes allowed in bash
270a["1"]=2
271echo status=$? len=${#a[@]}
272
273a['2']=3
274echo status=$? len=${#a[@]}
275
276# allowed in bash
277a[2 + "3"]=5
278echo status=$? len=${#a[@]}
279
280a[3 + '4']=5
281echo status=$? len=${#a[@]}
282
283## status: 1
284## STDOUT:
285## END
286
287## OK ash status: 2
288
289# syntax errors are not fatal in bash
290
291## BUG bash status: 0
292## BUG bash STDOUT:
293status=0 len=1
294status=1 len=1
295status=0 len=2
296status=1 len=2
297## END
298
299#### Tricky parsing - a[ a[0]=1 ]=X a[ a[0]+=1 ]+=X
300case $SH in zsh|mksh|ash) exit ;; esac
301
302# the nested [] means we can't use regular language lookahead?
303
304echo assign=$(( z[0] = 42 ))
305
306a[a[0]=1]=X
307declare -p a
308
309a[ a[2]=3 ]=Y
310declare -p a
311
312echo ---
313
314a[ a[0]+=1 ]+=X
315declare -p a
316
317## STDOUT:
318assign=42
319declare -a a=([0]="1" [1]="X")
320declare -a a=([0]="1" [1]="X" [2]="3" [3]="Y")
321---
322declare -a a=([0]="2" [1]="X" [2]="3X" [3]="Y")
323## END
324
325## N-I zsh/mksh/ash STDOUT:
326## END
327
328#### argv.py a[1 + 2]=
329case $SH in zsh|ash) exit ;; esac
330
331# This tests that the worse parser doesn't unconditinoally treat a[ as special
332
333a[1 + 2]= argv.py a[1 + 2]=
334echo status=$?
335
336a[1 + 2]+= argv.py a[1 + 2]+=
337echo status=$?
338
339argv.py a[3 + 4]=
340
341argv.py a[3 + 4]+=
342
343## STDOUT:
344['a[1', '+', '2]=']
345status=0
346['a[1', '+', '2]+=']
347status=0
348['a[3', '+', '4]=']
349['a[3', '+', '4]+=']
350## END
351
352## N-I zsh/ash STDOUT:
353## END
354
355#### declare builtin doesn't allow spaces
356case $SH in zsh|mksh|ash) exit ;; esac
357
358# OSH doesn't allow this
359declare a[a[0]=1]=X
360declare -p a
361
362# neither bash nor OSH allow this
363declare a[ a[2]=3 ]=Y
364declare -p a
365
366## STDOUT:
367declare -a a=([0]="1" [1]="X")
368declare -a a=([0]="1" [1]="X" [2]="3")
369## END
370
371## OK osh status: 1
372## OK osh STDOUT:
373## END
374
375## N-I zsh/mksh/ash STDOUT:
376## END