22
33## 算术表达式
44
5- ` $((...)) ` 语法可以进行整数的算术运算。
5+ ` ((...)) ` 语法可以进行整数的算术运算。
6+
7+ ``` bash
8+ $ (( foo = 5 + 5 ))
9+ $ echo $foo
10+ 10
11+ ```
12+
13+ 这个语法不返回值,在它前面加上美元符号` $((...)) ` ,就变成了算术表达式,可以返回算术运算的值。
614
715``` bash
816$ echo $(( 2 + 2 ))
9174
1018```
1119
12- 上面的例子返回了` 2 + 2 ` 的计算结果。
13-
14- ` $((...)) ` 忽略括号内部的空格,所以下面的写法都会得到同样的结果。
20+ ` $((...)) ` 忽略括号内部的空格,下面的写法都会得到同样的结果。
1521
1622``` bash
1723$ echo $(( 2 + 2 ))
@@ -58,6 +64,15 @@ $ echo $i
5864
5965上面例子中,` ++ ` 作为后缀是返回值,执行` echo ` 命令,再进行自增运算;作为前缀则是先进行自增运算,再返回值执行` echo ` 命令。
6066
67+ ` $((...)) ` 内部可以用圆括号改变运算顺序。
68+
69+ ``` bash
70+ $ echo $(( (2 + 3 ) * 4 ))
71+ 20
72+ ```
73+
74+ 上面例子中,内部的圆括号可以让加法先于乘法执行。
75+
6176` $((...)) ` 结构可以嵌套。
6277
6378``` bash
@@ -68,15 +83,6 @@ $ echo $(($((5**2)) * 3))
688375
6984```
7085
71- ` $((...)) ` 内部可以用圆括号改变运算顺序。
72-
73- ``` bash
74- $ echo $(( (2 + 3 ) * 4 ))
75- 20
76- ```
77-
78- 上面例子中,内部的圆括号可以让加法先于乘法执行。
79-
8086这个语法只能计算整数,否则会报错。
8187
8288``` bash
@@ -106,7 +112,7 @@ Bash 的数值默认都是十进制,但是在算术表达式中,也可以使
106112- ` number ` :没有任何特殊表示法的数字是十进制数(以10为底)。
107113- ` 0number ` :八进制数。
108114- ` 0xnumber ` :十六进制数。
109- - ` base#number ` :` base ` 进制的数 。
115+ - ` base#number ` :` base ` 进制的((foo = 5 + 5))数 。
110116
111117下面是一些例子。
112118
@@ -132,6 +138,13 @@ $ echo $((2#11111111))
132138- ` ^ ` :位的异或运算(exclusive or),对两个数字的所有位执行一个异或操作。
133139- ` , ` :求值运算。
134140
141+ 下面是右移运算符` >> ` 的例子。
142+
143+ ``` bash
144+ $ echo $(( 16 >> 2 ))
145+ 4
146+ ```
147+
135148下面是左移运算符` << ` 的例子。
136149
137150``` bash
@@ -143,6 +156,17 @@ done
143156
144157上面脚本执行后,会依次输出1、2、4、8。
145158
159+ 下面是` 17 ` (二进制` 1001 ` )和` 3 ` (二进制` 11 ` )的各种二进制运算的结果。
160+
161+ ``` bash
162+ $ echo $(( 17 & 3 ))
163+ 1
164+ $ echo $(( 17 | 3 ))
165+ 19
166+ $ echo $(( 17 ^3 ))
167+ 18
168+ ```
169+
146170## 逻辑运算
147171
148172` $((...)) ` 支持以下的逻辑运算符。
@@ -205,6 +229,14 @@ $ echo $a
205229- ` parameter |= value ` :等价于` parameter = parameter | value ` 。
206230- ` parameter ^= value ` :等价于` parameter = parameter ^ value ` 。
207231
232+ 下面是一个例子。
233+
234+ ``` bash
235+ $ foo=5
236+ $ echo $(( foo*= 2 ))
237+ 10
238+ ```
239+
208240如果在表达式内部赋值,可以放在圆括号中,否则会报错。
209241
210242``` bash
@@ -213,9 +245,7 @@ $ echo $(( a<1 ? (a+=1) : (a-=1) ))
213245
214246## 算术条件
215247
216- ` $((...)) ` 这个语法之中,真正的算术表达式其实是` ((...)) ` ,美元符号只是用来返回` ((...)) ` 的值。
217-
218- 在某些场合不需要返回值,这时可以直接使用` ((...)) ` ,最常见的就是` if ` 判断。
248+ ` if ` 判断可以使用` ((...)) ` 语法,进行算术运算的判断。
219249
220250``` bash
221251if (( 3 > 2 )) ; then
225255
226256上面代码执行后,会打印出` true ` 。
227257
228- 注意,算术计算的结果不是 ` 0 ` ,表示条件为真;如果是 ` 0 ` ,表示条件为假。这一点与命令是否执行成功,正好相反。
258+ 注意,算术运算的结果如果是 ` 0 ` ,表示条件为假。这一点与命令是否执行成功,正好相反。
229259
230260``` bash
231261$ if (( 1 )) ; then echo " It is true." ; fi
@@ -236,10 +266,19 @@ It is false.
236266
237267上面代码中,` ((1)) ` 表示条件为真,` ((0)) ` 表示条件为假。
238268
269+ ` if ` 判断也可以使用变量赋值。
270+
239271``` bash
240272$ if (( foo = 5 )) ; then echo " It is true." ; fi
241273It is true.
242274```
243275
244276上面例子中,` (( foo = 5 )) ` 完成了两件事情。首先把` 5 ` 赋值给变量` foo ` ,然后根据返回值` 5 ` ,判断条件为真。
245277
278+ 注意,赋值语句返回等号右边的值,如果返回的是` 0 ` ,则判断为假。
279+
280+ ``` bash
281+ $ if (( foo = 0 )) ; then echo " It is true." ; else echo " It is false." ; fi
282+ It is false.
283+ ```
284+
0 commit comments