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 $((
95 echo $[1+2]
96
97 ## STDOUT:
98 3
99 ## END
100 ## BUG dash/mksh STDOUT:
101 $[1+2]
102 ## END
103
104 #### $[$var is $(($var (#2426)
105 var=1
106 echo $[$var+2]
107
108 ## STDOUT:
109 3
110 ## END
111 ## BUG dash/mksh STDOUT:
112 $[1+2]
113 ## END
114
115 #### $[$undefined] is $(($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 ## BUG dash/zsh STDOUT:
125 ## END
126 ## BUG mksh STDOUT:
127 $[b[0]]
128 ## END
129 ## BUG zsh status: 1
130 ## BUG dash status: 2
131
132 #### Empty expression (( )) $(( ))
133
134 (( ))
135 echo status=$?
136
137 echo $(( ))
138
139 #echo $[]
140
141 ## STDOUT:
142 status=1
143 0
144 ## END
145
146 #### Empty expression for (( ))
147
148 for (( ; ; )); do
149 echo one
150 break
151 done
152
153 ## STDOUT:
154 one
155 ## END
156
157 ## N-I mksh status: 1
158 ## N-I mksh STDOUT:
159 ## END
160
161 #### Empty expression in ${a[@]: : }
162
163 a=(a b c d e f)
164
165 # space required here -- see spec/var-op-slice
166 echo slice ${a[@]: }
167 echo status=$?
168 echo
169
170 echo slice ${a[@]: : }
171 echo status=$?
172 echo
173
174 # zsh doesn't accept this
175 echo slice ${a[@]:: }
176 echo status=$?
177
178 ## STDOUT:
179 slice a b c d e f
180 status=0
181
182 slice
183 status=0
184
185 slice
186 status=0
187 ## END
188
189 ## BUG zsh status: 1
190 ## BUG zsh STDOUT:
191 slice a b c d e f
192 status=0
193
194 slice
195 status=0
196
197 ## END
198
199 ## BUG mksh status: 1
200 ## BUG mksh STDOUT:
201 ## END
202
203
204 #### Empty expression a[]
205
206 a=(1 2 3)
207
208 a[]=42
209 echo status=$?
210 echo ${a[@]}
211
212 echo ${a[]}
213 echo status=$?
214
215 ## status: 2
216 ## STDOUT:
217 ## END
218
219 ## OK zsh status: 1
220
221 # runtime failures
222
223 ## OK bash status: 0
224 ## OK bash STDOUT:
225 status=1
226 1 2 3
227 status=1
228 ## END
229
230 ## BUG mksh status: 0
231 ## BUG mksh STDOUT:
232 status=0
233 42 2 3
234 42
235 status=0
236 ## END
237
238
239 # Others
240 # [ 1+2 -eq 3 ]
241 # [[ 1+2 -eq 3 ]]
242 # unset a[]
243 # printf -v a[]
244