1 ## compare_shells: bash mksh zsh
2 ## oils_failures_allowed: 0
3
4 # Test arithmetic expressions in all their different contexts.
5
6 # $(( 1 + 2 ))
7 # (( a=1+2 ))
8 # ${a[ 1 + 2 ]}
9 # ${a : 1+2 : 1+2}
10 # a[1 + 2]=foo
11
12 #### Multiple right brackets inside expression
13
14 a=(1 2 3)
15 echo ${a[a[0]]} ${a[a[a[0]]]}
16
17 ## STDOUT:
18 2 3
19 ## END
20
21 ## N-I zsh status: 0
22 ## N-I zsh STDOUT:
23
24 ## END
25
26 #### Slicing of string with constants
27 s='abcd'
28 echo ${s:0} ${s:0:4} ${s:1:1}
29 ## stdout: abcd abcd b
30
31 #### Slicing of string with variables
32 s='abcd'
33 zero=0
34 one=1
35 echo ${s:$zero} ${s:$zero:4} ${s:$one:$one}
36 ## stdout: abcd abcd b
37
38 #### Array index on LHS of assignment
39 a=(1 2 3)
40 zero=0
41 a[zero+5-4]=X
42 echo ${a[@]}
43 ## stdout: 1 X 3
44 ## OK zsh stdout: X 2 3
45
46 #### Array index on LHS with indices
47 a=(1 2 3)
48 a[a[1]]=X
49 echo ${a[@]}
50 ## stdout: 1 2 X
51 ## OK zsh stdout: X 2 3
52
53 #### Slicing of string with expressions
54 # mksh accepts ${s:0} and ${s:$zero} but not ${s:zero}
55 # zsh says unrecognized modifier 'z'
56 s='abcd'
57 zero=0
58 echo ${s:zero} ${s:zero+0} ${s:zero+1:zero+1}
59 ## stdout: abcd abcd b
60 ## BUG mksh stdout-json: ""
61 ## BUG mksh status: 1
62 ## BUG zsh stdout-json: ""
63 ## BUG zsh status: 1
64
65 #### Ambiguous colon in slice
66 s='abcd'
67 echo $(( 0 < 1 ? 2 : 0 )) # evaluates to 2
68 echo ${s: 0 < 1 ? 2 : 0 : 1} # 2:1 -- TRICKY THREE COLONS
69 ## STDOUT:
70 2
71 c
72 ## END
73 ## BUG mksh/zsh STDOUT:
74 2
75 ## END
76 ## BUG mksh/zsh status: 1
77
78 #### Triple parens should be disambiguated
79 # The first paren is part of the math, parens 2 and 3 are a single token ending
80 # arith sub.
81 ((a=1 + (2*3)))
82 echo $a $((1 + (2*3)))
83 ## STDOUT:
84 7 7
85 ## END
86
87 #### Quadruple parens should be disambiguated
88 ((a=1 + (2 * (3+4))))
89 echo $a $((1 + (2 * (3+4))))
90 ## STDOUT:
91 15 15
92 ## END
93
94 #### $[ is a synonym for $((
95 echo $[1+2] $[3 * 4]
96
97 ## STDOUT:
98 3 12
99 ## END
100 ## N-I mksh STDOUT:
101 $[1+2] $[3 * 4]
102 ## END
103
104 #### $[$var is a synonym for $(($var (#2426)
105 var=1
106 echo $[$var+2]
107
108 ## STDOUT:
109 3
110 ## END
111 ## N-I mksh STDOUT:
112 $[1+2]
113 ## END
114
115 #### $[$undefined] is a synonym for $(($undefined (#2566)
116 a[0]=$[1+3]
117 b[0]=$[b[0]]
118 c[0]=$[b[0]]
119 echo ${c[0]}
120
121 ## STDOUT:
122 0
123 ## END
124
125 ## BUG zsh status: 1
126 ## BUG zsh STDOUT:
127 ## END
128
129 ## N-I mksh STDOUT:
130 $[b[0]]
131 ## END
132
133 #### Empty expression (( )) $(( ))
134
135 (( ))
136 echo status=$?
137
138 echo $(( ))
139
140 #echo $[]
141
142 ## STDOUT:
143 status=1
144 0
145 ## END
146
147 #### Empty expression for (( ))
148
149 for (( ; ; )); do
150 echo one
151 break
152 done
153
154 ## STDOUT:
155 one
156 ## END
157
158 ## N-I mksh status: 1
159 ## N-I mksh STDOUT:
160 ## END
161
162 #### Empty expression in ${a[@]: : }
163
164 a=(a b c d e f)
165
166 # space required here -- see spec/var-op-slice
167 echo slice ${a[@]: }
168 echo status=$?
169 echo
170
171 echo slice ${a[@]: : }
172 echo status=$?
173 echo
174
175 # zsh doesn't accept this
176 echo slice ${a[@]:: }
177 echo status=$?
178
179 ## STDOUT:
180 slice a b c d e f
181 status=0
182
183 slice
184 status=0
185
186 slice
187 status=0
188 ## END
189
190 ## BUG zsh status: 1
191 ## BUG zsh STDOUT:
192 slice a b c d e f
193 status=0
194
195 slice
196 status=0
197
198 ## END
199
200 ## BUG mksh status: 1
201 ## BUG mksh STDOUT:
202 ## END
203
204
205 #### Empty expression a[]
206
207 a=(1 2 3)
208
209 a[]=42
210 echo status=$?
211 echo ${a[@]}
212
213 echo ${a[]}
214 echo status=$?
215
216 ## status: 2
217 ## STDOUT:
218 ## END
219
220 ## OK zsh status: 1
221
222 # runtime failures
223
224 ## OK bash status: 0
225 ## OK bash STDOUT:
226 status=1
227 1 2 3
228 status=1
229 ## END
230
231 ## BUG mksh status: 0
232 ## BUG mksh STDOUT:
233 status=0
234 42 2 3
235 42
236 status=0
237 ## END
238
239
240 # Others
241 # [ 1+2 -eq 3 ]
242 # [[ 1+2 -eq 3 ]]
243 # unset a[]
244 # printf -v a[]
245