Skip to content

Commit bd06384

Browse files
committed
docs: edit arithmetic
1 parent f6c5487 commit bd06384

1 file changed

Lines changed: 32 additions & 20 deletions

File tree

docs/arithmetic.md

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ $ echo $((2 + 2))
4545
4
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))
6363
2
6464
```
6565

66-
`++``--`作为前缀是先运算后返回值,作为后缀是先返回值后运算。
66+
`++``--`这两个运算符有前缀和后缀的区别。作为前缀是先运算后返回值,作为后缀是先返回值后运算。
6767

6868
```bash
6969
$ i=0
@@ -79,7 +79,8 @@ $ echo $i
7979
2
8080
```
8181

82-
上面例子中,`++`作为后缀是返回值,执行`echo`命令,再进行自增运算;作为前缀则是先进行自增运算,再返回值执行`echo`命令。
82+
上面例子中,`++`作为后缀是先返回值,执行`echo`命令,再进行自增运算;作为前缀则是先进行自增运算,再返回值执行`echo`命令。
83+
8384

8485
`$((...))`内部可以用圆括号改变运算顺序。
8586

@@ -88,7 +89,7 @@ $ echo $(( (2 + 3) * 4 ))
8889
20
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))
115117
3
116118
```
117119

118-
如果在`$((...))`里面使用字符串,Bash 会认为那是一个空值的字符串,因此不会报错。
120+
上面例子中,变量`number`前面有没有美元符号,结果都是一样的。
121+
122+
如果在`$((...))`里面使用字符串,Bash 会认为那是一个变量名。如果不存在同名变量,Bash 就会将其作为空值,因此不会报错。
119123

120124
```bash
121125
$ echo $(( "hello" + 2))
@@ -124,9 +128,9 @@ $ echo $(( "hello" * 2))
124128
0
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
307319
5
308320
```
309321

310-
`expr`命令不支持非整数参数
322+
`expr`命令也不支持非整数参数
311323

312324
```bash
313325
$ expr 3.5 + 2

0 commit comments

Comments
 (0)