Skip to content

Commit eb1d273

Browse files
committed
docs: edit stack
1 parent 1d89393 commit eb1d273

3 files changed

Lines changed: 151 additions & 20 deletions

File tree

docs/arithmetic.md

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,22 @@
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))
917
4
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))
6883
75
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
221251
if ((3 > 2)); then
@@ -225,7 +255,7 @@ fi
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
241273
It 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+

docs/stack.md

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ $ cd -
1616

1717
## pushd,popd
1818

19-
如果希望记忆多重目录,可以使用`pushd`命令和`popd`命令。
19+
如果希望记忆多重目录,可以使用`pushd`命令和`popd`命令。它们用来操作目录堆栈。
2020

2121
`pushd`命令的用法类似`cd`命令,可以进入指定的目录。
2222

@@ -26,7 +26,7 @@ $ pushd dirname
2626

2727
第一次使用`pushd`命令时,会将当前目录先放入堆栈,然后将所要进入的目录也放入堆栈,位置在前一个记录的上方。以后每次使用`pushd`命令,都会将所要进入的目录,放在堆栈的顶部。
2828

29-
使用`popd`命令,会移除堆栈的顶部记录,并进入后一条目录所指向的目录(即原来的第二条目录)。
29+
使用`popd`命令,不带有参数时,会移除堆栈的顶部记录,并进入新的堆栈顶部目录(即原来的第二条目录)。
3030

3131
下面是一个例子。
3232

@@ -54,3 +54,63 @@ $ popd
5454
# 目录不变,当前堆栈为空
5555
$ popd
5656
```
57+
58+
这两个命令的参数如下。
59+
60+
**(1)-n 参数**
61+
62+
这两个命令有一个`-n`的参数,表示仅操作堆栈,不改变目录。
63+
64+
```bash
65+
$ popd -n
66+
```
67+
68+
上面的命令仅删除堆栈顶部的记录,但不改变目录,执行完成后还停留在当前目录。
69+
70+
**(2)整数参数**
71+
72+
这两个命令还可以接受一个整数作为参数。该整数表示堆栈中指定位置的记录(从0开始)。这时不会切换目录。
73+
74+
```bash
75+
# 从栈顶算起的3号目录(从0开始),移动到栈顶
76+
$ pushd +3
77+
78+
# 从栈底算起的3号目录(从0开始),移动到栈顶
79+
$ pushd -3
80+
81+
# 删除从栈顶算起的3号目录(从0开始)
82+
$ popd +3
83+
84+
# 删除从栈底算起的3号目录(从0开始)
85+
$ popd -3
86+
```
87+
88+
上面例子的整数编号都是从0开始计算,`popd +0`是删除第一个目录,`popd +1`是删除第二个,`popd -0`是删除最后一个目录,,`popd -1`是删除倒数第二个。
89+
90+
**(3)目录参数**
91+
92+
`pushd`可以接受一个目录作为参数,表示将该目录放到堆栈顶部,并进入该目录。
93+
94+
```bash
95+
$ pushd dir
96+
```
97+
98+
`popd`没有这个参数。
99+
100+
## dirs 命令
101+
102+
`dirs`命令可以显示目录堆栈的内容,一般用来查看`pushd``popd`操作后的结果。
103+
104+
```bash
105+
$ dirs
106+
```
107+
108+
它有以下参数。
109+
110+
- `-c`:清空目录栈。
111+
- `-l`:用户主目录不显示波浪号前缀,而打印完整的目录。
112+
- `-p`:每行一个条目打印目录栈,默认是打印在一行。
113+
- `-v`:每行一个条目,每个条目之前显示位置编号(从0开始)。
114+
- `+N``N`为整数,表示显示堆顶算起的第 N 个目录,从零开始。
115+
- `-N``N`为整数,表示显示堆底算起的第 N 个目录,从零开始。
116+

docs/variable.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,3 +416,35 @@ $ foo=2 # 无效
416416
- `-p`:打印出所有的只读变量。
417417
- `-a`:声明的变量为数组。
418418

419+
## let 命令
420+
421+
`let`命令声明变量时,可以直接执行算术表达式。
422+
423+
```bash
424+
$ let "foo = 1 + 2"
425+
$ echo $foo
426+
3
427+
```
428+
429+
上面例子中,`let`命令可以直接计算`1 + 2`
430+
431+
`let`命令的参数表达式如果包含空格,就需要使用引号。
432+
433+
```bash
434+
$ let "foo = 1 + 2"
435+
# 等同于
436+
$ let foo=1+2
437+
```
438+
439+
`let`可以同时对多个变量赋值,赋值表达式之间使用空格分隔。
440+
441+
```bash
442+
$ let "v1 = 1" "v2 = v1++"
443+
$ echo $v1,$v2
444+
2,1
445+
```
446+
447+
上面例子中,`let`声明了两个变量`v1``v2`,其中`v2`等于`v1++`,表示先返回`v1`的值,然后`v1`自增。
448+
449+
这种语法支持的运算符,参考《Bash 的算术运算》一章。
450+

0 commit comments

Comments
 (0)