Skip to content

Commit 3edd0ac

Browse files
committed
docs: edit arithmetic
1 parent 97c1db5 commit 3edd0ac

5 files changed

Lines changed: 145 additions & 54 deletions

File tree

docs/arithmetic.md

Lines changed: 68 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,38 @@ $ echo $foo
1010
10
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))
2845
4
2946
```
3047

@@ -98,6 +115,36 @@ $ echo $((number + 1))
98115
3
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

docs/condition.md

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -310,41 +310,67 @@ fi
310310

311311
### 算术条件
312312

313-
Bash 还提供了`((...))`作为算术条件。如果算术计算的结果是非零值,则表示判断成立。
313+
Bash 还提供了`((...))`作为算术条件,进行算术运算的判断。
314+
315+
```bash
316+
if ((3 > 2)); then
317+
echo "true"
318+
fi
319+
```
320+
321+
上面代码执行后,会打印出`true`
322+
323+
如果算术计算的结果是非零值,则表示判断成立。
314324

315325
```bash
316326
$ if ((1)); then echo "It is true."; fi
317327
It is true.
318-
$ if ((0)); then echo "It is true."; fi
319-
$
328+
$ if ((0)); then echo "It is true."; else echo "it is false."; fi
329+
It is false.
320330
```
321331

322332
上面例子中,`((1))`表示判断成立,`((0))`表示判断不成立。
323333

334+
算术条件`((...))`也可以用于变量赋值。
335+
336+
```bash
337+
$ if (( foo = 5 ));then echo "foo is $foo"; fi
338+
foo is 5
339+
```
340+
341+
上面例子中,`(( foo = 5 ))`完成了两件事情。首先把`5`赋值给变量`foo`,然后根据返回值`5`,判断条件为真。
342+
343+
注意,赋值语句返回等号右边的值,如果返回的是`0`,则判断为假。
344+
345+
```bash
346+
$ if (( foo = 0 ));then echo "It is true.";else echo "It is false."; fi
347+
It is false.
348+
```
349+
324350
下面是用算术条件改写的数值判断脚本。
325351

326352
```bash
327353
#!/bin/bash
328354
# test-integer2a: evaluate the value of an integer.
329355
INT=-5
330356
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
331-
if ((INT == 0)); then
332-
echo "INT is zero."
357+
if ((INT == 0)); then
358+
echo "INT is zero."
359+
else
360+
if ((INT < 0)); then
361+
echo "INT is negative."
333362
else
334-
if ((INT < 0)); then
335-
echo "INT is negative."
336-
else
337-
echo "INT is positive."
338-
fi
339-
if (( ((INT % 2)) == 0)); then
340-
echo "INT is even."
341-
else
342-
echo "INT is odd."
343-
fi
363+
echo "INT is positive."
344364
fi
365+
if (( ((INT % 2)) == 0)); then
366+
echo "INT is even."
367+
else
368+
echo "INT is odd."
369+
fi
370+
fi
345371
else
346-
echo "INT is not an integer." >&2
347-
exit 1
372+
echo "INT is not an integer." >&2
373+
exit 1
348374
fi
349375
```
350376

docs/loop.md

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,18 @@ Bash 提供了两个内部命令,用来在循环内部跳出循环。
6767

6868
`break`命令立即终止循环,程序继续执行循环之后的语句,即不再执行剩下的循环。
6969

70+
```bash
71+
for number in 1 2 3 4 5 6
72+
do
73+
echo "number is $number"
74+
if [ "$number" = "3" ]; then
75+
break
76+
fi
77+
done
78+
```
79+
80+
上面例子只会打印3行结果。一旦变量`$number`等于3,就会跳出循环,不再继续执行。
81+
7082
`continue`命令立即终止本轮循环,开始执行下一轮循环。
7183

7284
```bash
@@ -222,6 +234,8 @@ for filename in "$@" ; do
222234
done
223235
```
224236
237+
注意,`for...in`循环用在函数之中时,如果省略`in list`的部分,则`list`默认等于函数的所有参数。
238+
225239
## for 循环
226240
227241
`for`循环还支持 C 语言的循环语法。
@@ -234,13 +248,15 @@ done
234248
235249
上面代码中,`expression1`用来初始化循环条件,`expression2`用来决定循环结束的条件,`expression3`在每次循环迭代的末尾执行,用于更新值。
236250
251+
注意,循环条件放在双重圆括号之中。另外,圆括号之中使用变量,不必加上美元符号`$`
252+
237253
它等同于下面的`while`循环。
238254
239255
```bash
240256
(( expression1 ))
241257
while (( expression2 )); do
242-
commands
243-
(( expression3 ))
258+
commands
259+
(( expression3 ))
244260
done
245261
```
246262

docs/script.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,16 @@ Enter one or more values > a b c d
394394
REPLY = 'a b c d'
395395
```
396396

397-
`read`命令除了读取键盘输入,可以用来读取文件,详见下一节的例子。
397+
`read`命令除了读取键盘输入,可以用来读取文件。
398+
399+
```bash
400+
while read myline
401+
do
402+
echo "$myline"
403+
done < $filename
404+
```
405+
406+
上面的例子通过`read`命令,读取一个文件的内容。`done`命令后面的定向符`<`,将文件导向`read`命令,每次读取一行,存入变量`myline`,直到文件读取完毕。
398407

399408
`read`命令的参数如下。
400409

docs/variable.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,12 @@ $ echo $$
218218
10662
219219
```
220220

221+
这个特殊变量可以用来命名临时文件。
222+
223+
```bash
224+
LOGFILE=/tmp/output_log.$$
225+
```
226+
221227
(3)`$_`
222228

223229
`$_`为上一个命令的最后一个参数。

0 commit comments

Comments
 (0)