@@ -45,7 +45,7 @@ $ echo $((2 + 2))
45454
4646```
4747
48- 这个语法结构支持的算术运算符如下 。
48+ ` ((...)) ` 语法支持的算术运算符如下 。
4949
5050- ` + ` :加法
5151- ` - ` :减法
@@ -56,14 +56,14 @@ $ echo $((2 + 2))
5656- ` ++ ` :自增运算(前缀或后缀)
5757- ` -- ` :自减运算(前缀或后缀)
5858
59- 注意,上面的除法运算符的返回结果总是整数 ,比如` 5 ` 除以` 2 ` ,得到的结果是` 2 ` ,而不是` 2.5 ` 。
59+ 注意,除法运算符的返回结果总是整数 ,比如` 5 ` 除以` 2 ` ,得到的结果是` 2 ` ,而不是` 2.5 ` 。
6060
6161``` bash
6262$ echo $(( 5 / 2 ))
63632
6464```
6565
66- ` ++ ` 和` -- ` 作为前缀是先运算后返回值,作为后缀是先返回值后运算。
66+ ` ++ ` 和` -- ` 这两个运算符有前缀和后缀的区别。 作为前缀是先运算后返回值,作为后缀是先返回值后运算。
6767
6868``` bash
6969$ i=0
@@ -79,7 +79,8 @@ $ echo $i
79792
8080```
8181
82- 上面例子中,` ++ ` 作为后缀是返回值,执行` echo ` 命令,再进行自增运算;作为前缀则是先进行自增运算,再返回值执行` echo ` 命令。
82+ 上面例子中,` ++ ` 作为后缀是先返回值,执行` echo ` 命令,再进行自增运算;作为前缀则是先进行自增运算,再返回值执行` echo ` 命令。
83+
8384
8485` $((...)) ` 内部可以用圆括号改变运算顺序。
8586
@@ -88,7 +89,7 @@ $ echo $(( (2 + 3) * 4 ))
888920
8990```
9091
91- 上面例子中,内部的圆括号可以让加法先于乘法执行 。
92+ 上面例子中,内部的圆括号让加法先于乘法执行 。
9293
9394` $((...)) ` 结构可以嵌套。
9495
@@ -105,17 +106,20 @@ $ echo $(($((5**2)) * 3))
105106``` bash
106107# 报错
107108$ echo $(( 1 .5 + 1 ))
109+ bash: 语法错误
108110```
109111
110112` $((...)) ` 的圆括号之中,不需要在变量名之前加上` $ ` ,不过加上也不报错。
111113
112114``` bash
113115$ number=2
114- $ echo $(( number + 1 ))
116+ $ echo $(( $ number + 1 ))
1151173
116118```
117119
118- 如果在` $((...)) ` 里面使用字符串,Bash 会认为那是一个空值的字符串,因此不会报错。
120+ 上面例子中,变量` number ` 前面有没有美元符号,结果都是一样的。
121+
122+ 如果在` $((...)) ` 里面使用字符串,Bash 会认为那是一个变量名。如果不存在同名变量,Bash 就会将其作为空值,因此不会报错。
119123
120124``` bash
121125$ echo $(( "hello" + 2 ))
@@ -124,9 +128,9 @@ $ echo $(( "hello" * 2))
1241280
125129```
126130
127- 上面例子中,` "hello" ` 会被当作变量名,返回空值,` $((...)) ` 会将空值当作` 0 ` ,所以乘法的运算结果就是` 0 ` 。
131+ 上面例子中,` "hello" ` 会被当作变量名,返回空值,而 ` $((...)) ` 会将空值当作` 0 ` ,所以乘法的运算结果就是` 0 ` 。同理,如果 ` $((...)) ` 里面使用不存在的变量,也会当作 ` 0 ` 处理 。
128132
129- 如果一个变量的值为字符串,在` $((...)) ` 里面也会被当作空值 。
133+ 如果一个变量的值为字符串,跟上面的处理逻辑是一样的。即该字符串如果不对应已存在的变量, 在` $((...)) ` 里面会被当作空值 。
130134
131135``` bash
132136$ foo=hello
@@ -145,7 +149,7 @@ $ echo $(( foo + 2 ))
145149
146150上面代码中,` foo + 2 ` 取决于变量` hello ` 的值。
147151
148- ` $[...] ` 是以前的语法,也可以做整数运算,不建议使用。
152+ 最后, ` $[...] ` 是以前的语法,也可以做整数运算,不建议使用。
149153
150154``` bash
151155$ echo $[2+2]
@@ -159,7 +163,7 @@ Bash 的数值默认都是十进制,但是在算术表达式中,也可以使
159163- ` number ` :没有任何特殊表示法的数字是十进制数(以10为底)。
160164- ` 0number ` :八进制数。
161165- ` 0xnumber ` :十六进制数。
162- - ` base#number ` :` base ` 进制的((foo = 5 + 5))数 。
166+ - ` base#number ` :` base ` 进制的数 。
163167
164168下面是一些例子。
165169
@@ -183,7 +187,6 @@ $ echo $((2#11111111))
183187- ` ~ ` :位的“否”运算,对一个数字的所有位取反。
184188- ` ! ` :逻辑“否”运算
185189- ` ^ ` :位的异或运算(exclusive or),对两个数字的所有位执行一个异或操作。
186- - ` , ` :求值运算。
187190
188191下面是右移运算符` >> ` 的例子。
189192
@@ -195,14 +198,10 @@ $ echo $((16>>2))
195198下面是左移运算符` << ` 的例子。
196199
197200``` bash
198- #! /bin/bash
199- for (( i= 0 ;i< 4 ;++ i)) ; do
200- echo $(( 1 << i)) ;
201- done
201+ $ echo $(( 16 << 2 ))
202+ 64
202203```
203204
204- 上面脚本执行后,会依次输出1、2、4、8。
205-
206205下面是` 17 ` (二进制` 1001 ` )和` 3 ` (二进制` 11 ` )的各种二进制运算的结果。
207206
208207``` bash
@@ -226,7 +225,7 @@ $ echo $((17^3))
226225- ` != ` :不相等
227226- ` && ` :逻辑与
228227- ` || ` :逻辑或
229- - ` expr1?expr2:expr3 ` :三元条件三元运算符 。若表达式` expr1 ` 的计算结果为非零值(算术真),则执行表达式` expr2 ` ,否则执行表达式` expr3 ` 。
228+ - ` expr1?expr2:expr3 ` :三元条件运算符 。若表达式` expr1 ` 的计算结果为非零值(算术真),则执行表达式` expr2 ` ,否则执行表达式` expr3 ` 。
230229
231230如果逻辑表达式为真,返回` 1 ` ,否则返回` 0 ` 。
232231
@@ -290,6 +289,19 @@ $ echo $((foo*=2))
290289$ echo $(( a< 1 ? (a+= 1 ) : (a-= 1 ) ))
291290```
292291
292+ ## 求值运算
293+
294+ 逗号` , ` 在` $((...)) ` 内部是求值运算符,执行前后两个表达式,并返回后一个表达式的值。
295+
296+ ``` bash
297+ $ echo $(( foo = 1 + 2 , 3 * 4 ))
298+ 12
299+ $ echo $foo
300+ 3
301+ ```
302+
303+ 上面例子中,逗号前后两个表达式都会执行,然后返回后一个表达式的值` 12 ` 。
304+
293305## expr 命令
294306
295307` expr ` 命令支持算术运算,可以不使用` ((...)) ` 语法。
@@ -307,7 +319,7 @@ $ expr $foo + 2
3073195
308320```
309321
310- ` expr ` 命令不支持非整数参数 。
322+ ` expr ` 命令也不支持非整数参数 。
311323
312324``` bash
313325$ expr 3.5 + 2
0 commit comments