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