@@ -10,21 +10,38 @@ $ echo $foo
101010
1111```
1212
13- 这个语法不返回值,在它前面加上美元符号 ` $ ((...))` ,就变成了算术表达式,可以返回算术运算的值 。
13+ ` ((...)) ` 会自动忽略内部的空格,所以下面的写法都正确,得到同样的结果 。
1414
1515``` bash
16- $ echo $(( 2 + 2 ))
17- 4
16+ $ (( 2 + 2 ))
17+ $ (( 2 + 2 ))
18+ $ (( 2 + 2 ))
1819```
1920
20- ` $((...)) ` 忽略括号内部的空格,下面的写法都会得到同样的结果 。
21+ 这个语法不返回值,命令执行的结果根据算术运算的结果而定。只要算术结果不是 ` 0 ` ,命令就算执行成功 。
2122
2223``` bash
23- $ echo $(( 2 + 2 ))
24- 4
25- $ echo $(( 2 + 2 ))
26- 4
27- $ echo $(( 2 + 2 ))
24+ $ (( 3 + 2 ))
25+ $ echo $?
26+ 0
27+ ```
28+
29+ 上面例子中,` 3 + 2 ` 的结果是5,命令就算执行成功,环境变量` $? ` 为` 0 ` 。
30+
31+ 如果算术结果为` 0 ` ,命令就算执行失败。
32+
33+ ``` bash
34+ $ (( 3 - 3 ))
35+ $ echo $?
36+ 1
37+ ```
38+
39+ 上面例子中,` 3 - 3 ` 的结果是` 0 ` ,环境变量` $? ` 为` 1 ` ,表示命令执行失败。
40+
41+ 如果要读取算术运算的结果,需要在` ((...)) ` 前面加上美元符号` $((...)) ` ,使其变成算术表达式,返回算术运算的值。
42+
43+ ``` bash
44+ $ echo $(( 2 + 2 ))
28454
2946```
3047
@@ -98,6 +115,36 @@ $ echo $((number + 1))
981153
99116```
100117
118+ 如果在` $((...)) ` 里面使用字符串,Bash 会认为那是一个空值的字符串,因此不会报错。
119+
120+ ``` bash
121+ $ echo $(( "hello" + 2 ))
122+ 2
123+ $ echo $(( "hello" * 2 ))
124+ 0
125+ ```
126+
127+ 上面例子中,` "hello" ` 会被当作变量名,返回空值,` $((...)) ` 会将空值当作` 0 ` ,所以乘法的运算结果就是` 0 ` 。
128+
129+ 如果一个变量的值为字符串,在` $((...)) ` 里面也会被当作空值。
130+
131+ ``` bash
132+ $ foo=hello
133+ $ echo $(( foo + 2 ))
134+ 2
135+ ```
136+
137+ 上面例子中,变量` foo ` 的值是` hello ` ,而` hello ` 也会被看作变量名。这使得有可能写出动态替换的代码。
138+
139+ ``` bash
140+ $ foo=hello
141+ $ hello=3
142+ $ echo $(( foo + 2 ))
143+ 5
144+ ```
145+
146+ 上面代码中,` foo + 2 ` 取决于变量` hello ` 的值。
147+
101148` $[...] ` 是以前的语法,也可以做整数运算,不建议使用。
102149
103150``` bash
@@ -243,42 +290,29 @@ $ echo $((foo*=2))
243290$ echo $(( a< 1 ? (a+= 1 ) : (a-= 1 ) ))
244291```
245292
246- ## 算术条件
293+ ## expr 命令
247294
248- ` if ` 判断可以使用 ` ((...)) ` 语法,进行算术运算的判断 。
295+ ` expr ` 命令支持算术运算,可以不使用 ` ((...)) ` 语法。
249296
250297``` bash
251- if (( 3 > 2 )) ; then
252- echo " true"
253- fi
298+ $ expr 3 + 2
299+ 5
254300```
255301
256- 上面代码执行后,会打印出` true ` 。
257-
258- 注意,算术运算的结果如果是` 0 ` ,表示条件为假。这一点与命令是否执行成功,正好相反。
302+ ` expr ` 命令支持变量替换。
259303
260304``` bash
261- $ if (( 1 )) ; then echo " It is true." ; fi
262- It is true.
263- $ if (( 0 )) ; then echo " It is true." ; else echo " it is false." ; fi
264- It is false.
305+ $ foo=3
306+ $ expr $foo + 2
307+ 5
265308```
266309
267- 上面代码中,` ((1)) ` 表示条件为真,` ((0)) ` 表示条件为假。
268-
269- ` if ` 判断也可以使用变量赋值。
310+ ` expr ` 命令不支持非整数参数。
270311
271312``` bash
272- $ if (( foo = 5 )) ; then echo " It is true. " ; fi
273- It is true.
313+ $ expr 3.5 + 2
314+ expr: 非整数参数
274315```
275316
276- 上面例子中,` (( foo = 5 )) ` 完成了两件事情。首先把` 5 ` 赋值给变量` foo ` ,然后根据返回值` 5 ` ,判断条件为真。
277-
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- ```
317+ 上面例子中,如果有非整数的运算,` expr ` 命令就报错了。
284318
0 commit comments