Skip to content

Commit 1300534

Browse files
committed
docs: add stack
1 parent 297df0c commit 1300534

3 files changed

Lines changed: 77 additions & 102 deletions

File tree

docs/expansion.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ baz
382382

383383
## 子命令扩展
384384

385-
`$(...)`可以扩展成另一个命令的运行结果。
385+
`$(...)`可以扩展成另一个命令的运行结果,内部命令的所有输出都会作为返回值
386386

387387
```bash
388388
$ echo $(date)
@@ -398,6 +398,8 @@ $ echo `date`
398398
Tue Jan 28 00:01:13 CST 2020
399399
```
400400

401+
`$(...)`还可以嵌套,比如`$(ls $(pwd))`
402+
401403
## 算术扩展
402404

403405
`$((...))`可以扩展成整数运算的结果。

docs/stack.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# 目录堆栈
2+
3+
## cd -
4+
5+
Bash 可以记忆用户进入过的目录。默认情况下,只记忆前一次所在的目录,`cd -`命令可以返回前一次的目录。
6+
7+
```bash
8+
# 当前目录是 /path/to/foo
9+
$ cd bar
10+
11+
# 重新回到 /path/to/foo
12+
$ cd -
13+
```
14+
15+
上面例子中,用户原来所在的目录是`/path/to/foo`,进入子目录`bar`以后,使用`cd -`可以回到原来的目录。
16+
17+
## pushd,popd
18+
19+
如果希望记忆多重目录,可以使用`pushd`命令和`popd`命令。
20+
21+
`pushd`命令的用法类似`cd`命令,可以进入指定的目录。
22+
23+
```bash
24+
$ pushd dirname
25+
```
26+
27+
第一次使用`pushd`命令时,会将当前目录先放入堆栈,然后将所要进入的目录也放入堆栈,位置在前一个记录的上方。以后每次使用`pushd`命令,都会将所要进入的目录,放在堆栈的顶部。
28+
29+
使用`popd`命令,会移除堆栈的顶部记录,并进入后一条目录所指向的目录(即原来的第二条目录)。
30+
31+
下面是一个例子。
32+
33+
```bash
34+
# 当前处在主目录,堆栈为空
35+
$ pwd
36+
/home/me
37+
38+
# 进入 /home/me/foo
39+
# 当前堆栈为 /home/me/foo /home/me
40+
$ pushd ~/foo
41+
42+
# 进入 /etc
43+
# 当前堆栈为 /etc /home/me/foo /home/me
44+
$ pushd /etc
45+
46+
# 进入 /home/me/foo
47+
# 当前堆栈为 /home/me/foo /home/me
48+
$ popd
49+
50+
# 进入 /home/me
51+
# 当前堆栈为 /home/me
52+
$ popd
53+
54+
# 目录不变,当前堆栈为空
55+
$ popd
56+
```

docs/string.md

Lines changed: 18 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ footman
4444

4545
上面例子是返回变量`count`从4号位置一直到结尾的子字符串。
4646

47+
如果`offset`为负值,表示从字符串的末尾开始算起。注意,负数前面必须有一个空格, 以防止与`${variable:-word}`的变量设置默认值的形式混淆。这时,如果还指定`length`,则`length`不能小于零。
48+
49+
```bash
50+
$ foo="This string is long."
51+
$ echo ${foo: -5}
52+
long.
53+
$ echo ${foo: -5:2}
54+
lo
55+
```
56+
57+
上面例子中,`offset``-5`,表示从倒数第5个字符开始截取,所以返回`long.`。如果指定长度为`2`,则返回`lo`
58+
4759
## 字符串的处理
4860

4961
Bash 提供字符串处理的多种方法。
@@ -189,112 +201,17 @@ $ echo ${path/.*/}
189201

190202
上面例子中,第二个斜杠后面的`string`部分省略了,所以模式`.*`匹配的部分`.name`被删除后返回。
191203

192-
## 返回变量名的展开
193-
194-
`${!prefix*}``${!prefix@}`,会返回以 prefix 开头的已有变量名,它们的执行结果相同。
195-
196-
```bash
197-
$ echo ${!BASH*}
198-
BASH BASH_ARGC BASH_ARGV BASH_COMMAND BASH_COMPLETION
199-
BASH_COMPLETION_DIR BASH_LINENO BASH_SOURCE BASH_SUBSHELL
200-
BASH_VERSINFO BASH_VERSION
201-
```
202-
203-
## 字符串的展开
204-
205-
字符串长度
206-
207-
```bash
208-
${#parameter}
209-
```
210-
211-
`${#parameter}`展开成由 parameter 所包含的字符串的长度。通常,parameter 是一个字符串;然而,如果 parameter 是`@`或者是`*` 的话, 则展开结果是位置参数的个数。
212-
213-
```bash
214-
$ foo="This string is long."
215-
$ echo "'$foo' is ${#foo} characters long."
216-
'This string is long.' is 20 characters long.
217-
```
218-
219-
截取子字符串。
220-
221-
```bash
222-
${parameter:offset}
223-
224-
${parameter:offset:length}
225-
```
226-
227-
这些展开用来从 parameter 所包含的字符串中提取一部分字符。提取的字符始于 第 offset 个字符(从字符串开头算起)直到字符串的末尾,除非指定提取的长度。
228-
229-
```bash
230-
$ foo="This string is long."
231-
$ echo ${foo:5}
232-
string is long.
233-
$ echo ${foo:5:6}
234-
string
235-
```
236-
237-
若 offset 的值为负数,则认为 offset 值是从字符串的末尾开始算起,而不是从开头。注意负数前面必须有一个空格, 为防止与 ${parameter:-word} 展开形式混淆。length,若出现,则必须不能小于零。
204+
这个语法还有两种扩展形式。
238205

239206
```bash
240-
$ foo="This string is long."
241-
$ echo ${foo: -5}
242-
long.
243-
$ echo ${foo: -5:2}
244-
lo
245-
```
246-
247-
如果 parameter 是 @,展开结果是 length 个位置参数,从第 offset 个位置参数开始。
207+
# 模式必须出现在字符串的开头
208+
${variable/#pattern/string}
248209

249-
清除匹配的模式
250-
251-
```bash
252-
${parameter#pattern}
253-
254-
${parameter##pattern}
255-
```
256-
257-
这些展开会从 paramter 所包含的字符串中清除开头一部分文本,这些字符要匹配定义的 patten。pattern 是 通配符模式,就如那些用在路径名展开中的模式。这两种形式的差异之处是该 # 形式清除最短的匹配结果, 而该 ## 模式清除最长的匹配结果。
258-
259-
```bash
260-
$ foo=file.txt.zip
261-
$ echo ${foo#*.}
262-
txt.zip
263-
$ echo ${foo##*.}
264-
zip
210+
# 模式必须出现在字符串的结尾
211+
${variable/%pattern/string}
265212
```
266213

267-
清除匹配的模式(从尾部开始)
268-
269-
```bash
270-
${parameter%pattern}
271-
272-
${parameter%%pattern}
273-
```
274-
275-
这些展开和上面的 # 和 ## 展开一样,除了它们清除的文本从 parameter 所包含字符串的末尾开始,而不是开头。
276-
277-
```bash
278-
$ foo=file.txt.zip
279-
$ echo ${foo%.*}
280-
file.txt
281-
$ echo ${foo%%.*}
282-
file
283-
```
284-
285-
查找和替换
286-
287-
```bash
288-
${parameter/pattern/string}
289-
290-
${parameter//pattern/string}
291-
292-
${parameter/#pattern/string}
293-
294-
${parameter/%pattern/string}
295-
```
296-
297-
这种形式的展开对 parameter 的内容执行查找和替换操作。如果找到了匹配通配符 pattern 的文本, 则用 string 的内容替换它。在正常形式下,只有第一个匹配项会被替换掉。在该 // 形式下,所有的匹配项都会被替换掉。 该 /# 要求匹配项出现在字符串的开头,而 /% 要求匹配项出现在字符串的末尾。/string 可能会省略掉,这样会 导致删除匹配的文本。
214+
下面是一个例子。
298215

299216
```bash
300217
$ foo=JPG.JPG

0 commit comments

Comments
 (0)