1
2 #### recursive arith: one level
3 a='b=123'
4 echo $((a))
5 ## stdout: 123
6 ## N-I dash status: 2
7 ## N-I dash stdout-json: ""
8 ## N-I yash stdout: b=123
9
10 #### recursive arith: two levels
11 a='b=c' c='d=123'
12 echo $((a))
13 ## stdout: 123
14 ## N-I dash status: 2
15 ## N-I dash stdout-json: ""
16 ## N-I yash stdout: b=c
17
18 #### recursive arith: short circuit &&, ||
19 # Note: mksh R52 has a bug. Even though it supports a short circuit like
20 # "echo $((cond&&(a=1)))", it doesn't work with "x=a=1; echo
21 # $((cond&&x))". It is fixed at least in mksh R57.
22 # Note: "busybox sh" doesn't support short circuit.
23 a=b=123
24 echo $((1||a)):$((b))
25 echo $((0||a)):$((b))
26 c=d=321
27 echo $((0&&c)):$((d))
28 echo $((1&&c)):$((d))
29 ## stdout-json: "1:0\n1:123\n0:0\n1:321\n"
30 ## BUG mksh stdout-json: "1:123\n1:123\n0:321\n1:321\n"
31 ## N-I ash stdout-json: "1:123\n1:123\n0:321\n1:321\n"
32 ## N-I dash/yash status: 2
33 ## N-I dash/yash stdout-json: "1:0\n"
34
35 #### recursive arith: short circuit ?:
36 # Note: "busybox sh" behaves strangely.
37 y=a=123 n=a=321
38 echo $((1?(y):(n))):$((a))
39 echo $((0?(y):(n))):$((a))
40 ## STDOUT:
41 123:123
42 321:321
43 ## END
44 ## BUG ash STDOUT:
45 123:321
46 321:321
47 ## END
48 ## N-I dash status: 2
49 ## N-I dash stdout-json: ""
50 ## N-I yash STDOUT:
51 a=123:0
52 a=321:0
53 ## END
54
55 #### recursive arith: side effects
56 # In Zsh and Busybox sh, the side effect of inner arithmetic
57 # evaluations seems to take effect only after the whole evaluation.
58 a='b=c' c='d=123'
59 echo $((a,d)):$((d))
60 ## stdout: 123:123
61 ## BUG zsh/ash stdout: 0:123
62 ## N-I dash/yash status: 2
63 ## N-I dash/yash stdout-json: ""
64
65 #### recursive arith: recursion
66 loop='i<=100&&(s+=i,i++,loop)' s=0 i=0
67 echo $((a=loop,s))
68 ## stdout: 5050
69 ## N-I mksh status: 1
70 ## N-I mksh stdout-json: ""
71 ## N-I ash/dash/yash status: 2
72 ## N-I ash/dash/yash stdout-json: ""
73
74 #### recursive arith: array elements
75 text[1]='d=123'
76 text[2]='text[1]'
77 text[3]='text[2]'
78 echo $((a=text[3]))
79 ## stdout: 123
80 ## N-I ash/dash/yash status: 2
81 ## N-I ash/dash/yash stdout-json: ""
82
83 #### dynamic arith varname: assign
84 vec2_set () {
85 local this=$1 x=$2 y=$3
86 : $(( ${this}_x = $2 ))
87 : $(( ${this}_y = y ))
88 }
89 vec2_set a 3 4
90 vec2_set b 5 12
91 echo a_x=$a_x a_y=$a_y
92 echo b_x=$b_x b_y=$b_y
93 ## STDOUT:
94 a_x=3 a_y=4
95 b_x=5 b_y=12
96 ## END
97
98 #### dynamic arith varname: read
99
100 vec2_load() {
101 local this=$1
102 x=$(( ${this}_x ))
103 : $(( y = ${this}_y ))
104 }
105 a_x=12 a_y=34
106 vec2_load a
107 echo x=$x y=$y
108 ## STDOUT:
109 x=12 y=34
110 ## END
111
112 #### dynamic arith varname: copy/add
113 shopt -s eval_unsafe_arith # for RHS
114
115 vec2_copy () {
116 local this=$1 rhs=$2
117 : $(( ${this}_x = $(( ${rhs}_x )) ))
118 : $(( ${this}_y = ${rhs}_y ))
119 }
120 vec2_add () {
121 local this=$1 rhs=$2
122 : $(( ${this}_x += $(( ${rhs}_x )) ))
123 : $(( ${this}_y += ${rhs}_y ))
124 }
125 a_x=3 a_y=4
126 b_x=4 b_y=20
127 vec2_copy c a
128 echo c_x=$c_x c_y=$c_y
129 vec2_add c b
130 echo c_x=$c_x c_y=$c_y
131 ## STDOUT:
132 c_x=3 c_y=4
133 c_x=7 c_y=24
134 ## END
135
136 #### is-array with ${var@a}
137 case $SH in (mksh|ash|dash|yash) exit 1 ;; esac
138
139 function ble/is-array { [[ ${!1@a} == *a* ]]; }
140
141 ble/is-array undef
142 echo undef $?
143
144 string=''
145 ble/is-array string
146 echo string $?
147
148 array=(one two three)
149 ble/is-array array
150 echo array $?
151 ## STDOUT:
152 undef 1
153 string 1
154 array 0
155 ## END
156 ## N-I zsh/mksh/ash/dash/yash status: 1
157 ## N-I zsh/mksh/ash/dash/yash stdout-json: ""