]> git.ipfire.org Git - thirdparty/bash.git/blob - tests/arith.tests
Bash-4.3 patch 7
[thirdparty/bash.git] / tests / arith.tests
1 set +o posix
2 declare -i iv jv
3
4 iv=$(( 3 + 5 * 32 ))
5 echo $iv
6 iv=iv+3
7 echo $iv
8 iv=2
9 jv=iv
10
11 let "jv *= 2"
12 echo $jv
13 jv=$(( $jv << 2 ))
14 echo $jv
15
16 let jv="$jv / 2"
17 echo $jv
18 jv="jv >> 2"
19 echo $jv
20
21 iv=$((iv+ $jv))
22 echo $iv
23 echo $((iv -= jv))
24 echo $iv
25 echo $(( iv == jv ))
26 echo $(( iv != $jv ))
27 echo $(( iv < jv ))
28 echo $(( $iv > $jv ))
29 echo $(( iv <= $jv ))
30 echo $(( $iv >= jv ))
31
32 echo $jv
33 echo $(( ~$jv ))
34 echo $(( ~1 ))
35 echo $(( ! 0 ))
36
37 echo $(( jv % 2 ))
38 echo $(( $iv % 4 ))
39
40 echo $(( iv <<= 16 ))
41 echo $(( iv %= 33 ))
42
43 echo $(( 33 & 55 ))
44 echo $(( 33 | 17 ))
45
46 echo $(( iv && $jv ))
47 echo $(( $iv || jv ))
48
49 echo $(( iv && 0 ))
50 echo $(( iv & 0 ))
51 echo $(( iv && 1 ))
52 echo $(( iv & 1 ))
53
54 echo $(( $jv || 0 ))
55 echo $(( jv | 0 ))
56 echo $(( jv | 1 ))
57 echo $(( $jv || 1 ))
58
59 let 'iv *= jv'
60 echo $iv
61 echo $jv
62 let "jv += $iv"
63 echo $jv
64
65 echo $(( jv /= iv ))
66 echo $(( jv <<= 8 ))
67 echo $(( jv >>= 4 ))
68
69 echo $(( iv |= 4 ))
70 echo $(( iv &= 4 ))
71
72 echo $(( iv += (jv + 9)))
73 echo $(( (iv + 4) % 7 ))
74
75 # unary plus, minus
76 echo $(( +4 - 8 ))
77 echo $(( -4 + 8 ))
78
79 # conditional expressions
80 echo $(( 4<5 ? 1 : 32))
81 echo $(( 4>5 ? 1 : 32))
82 echo $(( 4>(2+3) ? 1 : 32))
83 echo $(( 4<(2+3) ? 1 : 32))
84 echo $(( (2+2)<(2+3) ? 1 : 32))
85 echo $(( (2+2)>(2+3) ? 1 : 32))
86
87 # bug in bash versions through bash-3.2
88 S=105
89 W=$((S>99?4:S>9?3:S>0?2:0))
90 echo $W
91 unset W S
92
93 # check that the unevaluated part of the ternary operator does not do
94 # evaluation or assignment
95 x=i+=2
96 y=j+=2
97 declare -i i=1 j=1
98 echo $((1 ? 20 : (x+=2)))
99 echo $i,$x
100 echo $((0 ? (y+=2) : 30))
101 echo $j,$y
102
103 x=i+=2
104 y=j+=2
105 declare -i i=1 j=1
106 echo $((1 ? 20 : (x+=2)))
107 echo $i,$x
108 echo $((0 ? (y+=2) : 30))
109 echo $i,$y
110
111 # check precedence of assignment vs. conditional operator
112 # should be an error
113 declare -i x=2
114 y=$((1 ? 20 : x+=2))
115
116 # check precedence of assignment vs. conditional operator
117 declare -i x=2
118 echo $((0 ? x+=2 : 20))
119
120 # associativity of assignment-operator operator
121 declare -i i=1 j=2 k=3
122 echo $((i += j += k))
123 echo $i,$j,$k
124
125 # octal, hex
126 echo $(( 0x100 | 007 ))
127 echo $(( 0xff ))
128 echo $(( 16#ff ))
129 echo $(( 16#FF/2 ))
130 echo $(( 8#44 ))
131
132 echo $(( 8 ^ 32 ))
133
134 # other bases
135 echo $(( 16#a ))
136 echo $(( 32#a ))
137 echo $(( 56#a ))
138 echo $(( 64#a ))
139
140 echo $(( 16#A ))
141 echo $(( 32#A ))
142 echo $(( 56#A ))
143 echo $(( 64#A ))
144
145 echo $(( 64#@ ))
146 echo $(( 64#_ ))
147
148 # weird bases
149 echo $(( 3425#56 ))
150
151 # missing number after base
152 echo $(( 2# ))
153
154 # these should generate errors
155 echo $(( 7 = 43 ))
156 echo $(( 2#44 ))
157 echo $(( 44 / 0 ))
158 let 'jv += $iv'
159 echo $(( jv += \$iv ))
160 let 'rv = 7 + (43 * 6'
161
162 # more errors
163 declare -i i
164 i=0#4
165 i=2#110#11
166
167 ((echo abc; echo def;); echo ghi)
168
169 if (((4+4) + (4 + 7))); then
170 echo ok
171 fi
172
173 (()) # make sure the null expression works OK
174
175 a=(0 2 4 6)
176 echo $(( a[1] + a[2] ))
177 echo $(( (a[1] + a[2]) == a[3] ))
178 (( (a[1] + a[2]) == a[3] )) ; echo $?
179
180 # test pushing and popping the expression stack
181 unset A
182 A="4 + "
183 echo $(( ( 4 + A ) + 4 ))
184 A="3 + 5"
185 echo $(( ( 4 + A ) + 4 ))
186
187 # badly-formed conditional expressions
188 echo $(( 4 ? : $A ))
189 echo $(( 1 ? 20 ))
190 echo $(( 4 ? 20 : ))
191
192 # precedence and short-circuit evaluation
193 B=9
194 echo $B
195
196 echo $(( 0 && B=42 ))
197 echo $B
198
199 echo $(( 1 || B=88 ))
200 echo $B
201
202 echo $(( 0 && (B=42) ))
203 echo $B
204
205 echo $(( (${$} - $$) && (B=42) ))
206 echo $B
207
208 echo $(( 1 || (B=88) ))
209 echo $B
210
211 # until command with (( )) command
212 x=7
213
214 echo $x
215 until (( x == 4 ))
216 do
217 echo $x
218 x=4
219 done
220
221 echo $x
222
223 # exponentiation
224 echo $(( 2**15 - 1))
225 echo $(( 2**(16-1)))
226 echo $(( 2**16*2 ))
227 echo $(( 2**31-1))
228 echo $(( 2**0 ))
229
230 # {pre,post}-{inc,dec}rement and associated errors
231
232 x=4
233
234 echo $x
235 echo $(( x++ ))
236 echo $x
237 echo $(( x-- ))
238 echo $x
239
240 echo $(( --x ))
241 echo $x
242
243 echo $(( ++x ))
244 echo $x
245
246 echo $(( ++7 ))
247 echo $(( 7-- ))
248
249 echo $(( --x=7 ))
250 echo $(( ++x=7 ))
251
252 echo $(( x++=7 ))
253 echo $(( x--=7 ))
254
255 echo $x
256
257 echo $(( +7 ))
258 echo $(( -7 ))
259
260 echo $(( ++7 ))
261 echo $(( --7 ))
262
263 ${THIS_SH} ./arith1.sub
264 ${THIS_SH} ./arith2.sub
265 ${THIS_SH} ./arith3.sub
266 ${THIS_SH} ./arith4.sub
267
268 # make sure arithmetic expansion handles ints > 2**31 - 1 using intmax_t
269 echo $(( 2147483645 + 4 ))
270
271 # other tests using INTMAX_MIN and INTMAX_MAX that cause exceptions if not
272 # handled correctly -- problem through bash-4.2
273 ${THIS_SH} ./arith5.sub
274
275 # problems with suppressing evaluation present through bash-4.2
276 ${THIS_SH} ./arith6.sub
277
278 x=4
279 y=7
280
281 (( x=8 , y=12 ))
282
283 echo $x $y
284
285 # should be an error
286 (( x=9 y=41 ))
287
288 # These are errors
289 unset b
290 echo $((a b))
291 ((a b))
292
293 n=42
294 printf "%d\n" $n
295 printf "%i\n" $n
296 echo $(( 8#$(printf "%o\n" $n) ))
297 printf "%u\n" $n
298 echo $(( 16#$(printf "%x\n" $n) ))
299 echo $(( 16#$(printf "%X\n" $n) ))
300
301 # causes longjmp botches through bash-2.05b
302 a[b[c]d]=e