1- # Bash 的通配符
1+ # Bash 的扩展模式
22
33Shell 接收到用户输入的命令以后,会根据空格将用户的输入,拆分成一个个词元(token)。然后,Shell 会扩展词元里面的特殊字符,扩展完成后才会调用相应的命令。
44
5- Shell 的命令扩展一共有八种 。
5+ 这种特殊字符的扩展,称为通配符扩展(wildcard expansion)或者模式扩展(globbing)。Bash 一共提供八种扩展,先进行扩展,然后再执行命令 。
66
7- Bash 提供通配符(wildcards),用一种很短的文本模式(通常只有一个字符),简洁地代表一组路径。 Bash 在执行命令之前,会自动扩展命令中的通配符 。
7+ 早期的 Unix 系统有一个 ` /etc/glob ` 文件,保存扩展的模板。后来 Bash 内置了这个功能,但是这个名字保留了下来。特殊字符的扩展早于正则表达式出现,可以看作是原始的正则表达式。它的功能没有正则那么强大灵活,但是优点是简单和方便 。
88
9- 通配符又叫做 globbing patterns。因为 Unix 早期有一个` /etc/glob ` 文件保存通配符模板,后来 Bash 内置了这个功能,但是这个名字被保留了下来。
9+ ## 波浪线扩展
10+
11+ 波浪线` ~ ` 会自动扩展成当前用户的主目录。
12+
13+ ``` bash
14+ $ echo ~
15+ /home/me
16+ ```
17+
18+ 如果要进入主目录的某个子目录,通常会把子目录放在波浪号后面。
19+
20+ ``` bash
21+ # 进入 /home/me/foo 目录
22+ $ cd ~ /foo
23+ ```
24+
25+ 如果` ~ ` 后面是已经存在的用户名,则会返回该用户的主目录。
26+
27+ ``` bash
28+ $ echo ~ foo
29+ /home/foo
30+
31+ $ echo ~ root
32+ /root
33+ ```
34+
35+ 上面例子中,Bash 会根据波浪号后面的用户名,返回该用户的主目录。
1036
11- 通配符早于正则表达式出现,可以看作是原始的正则表达式。它的功能没有正则那么强大灵活,但是胜在简单和方便。
37+ 如果是不存在的用户名,则波浪号扩展不起作用。
38+
39+ ``` bash
40+ $ echo ~ nonExistedUser
41+ ~ nonExistedUser
42+ ```
43+
44+ 此外,` ~+ ` 会返回当前所在的目录,等同于` pwd ` 命令。
45+
46+ ``` bash
47+ $ cd ~ /foo
48+ $ echo ~ +
49+ /home/me/foo
50+ ```
1251
13- ## ` ? ` 字符
52+ ## ` ? ` 字符扩展
1453
1554` ? ` 字符代表任意的单个字符,不包括空字符。比如,` Data??? ` 匹配所有` Data ` 开头后面跟着三个字符的文件名。
1655
@@ -32,9 +71,21 @@ ab.txt
3271
3372上面命令中,` ?? ` 匹配了两个字符。
3473
35- 注意,` ? ` 不能匹配空字符。也就是说,它占据的位置必须有字符存在 。
74+ 注意,Bash 是先进行扩展,再执行命令。因此,扩展的结果决定了命令执行的结果,各种扩展只是 Bash 的功能,命令本身并不存在参数扩展,收到什么参数就原样执行 。
3675
37- ## ` * ` 字符
76+ ``` bash
77+ # 当前目录有 a.txt 文件
78+ $ echo ? .txt
79+ a.txt
80+
81+ # 当前目录为空目录
82+ $ echo ? .txt
83+ ? .txt
84+ ```
85+
86+ 上面例子中,如果` ?.txt ` 可以扩展成文件名,` echo ` 命令会输出扩展后的结果;如果不能扩展成文件名,` echo ` 就会原样输出` ?.txt ` 。
87+
88+ ## ` * ` 字符扩展
3889
3990` * ` 字符代表任意数量的字符,包括零个字符。
4091
@@ -80,33 +131,44 @@ a.txt b.txt
80131
81132上面命令中,` [ab] ` 表示可以扩展成` a ` 或` b ` 。
82133
83- 方括号` [start-end] ` 表示一个连续的范围。
134+ 方括号模式还有两种变体:` [^...] ` 和` [!...] ` 。它们表示匹配不在方括号里面的字符,这两种写法是等价的。比如,` [^abc] ` 或` [!abc] ` 表示匹配除了` a ` 、` b ` 、` c ` 以外的字符。
135+
136+ ``` bash
137+ $ ls ? [! a]?
138+ aba bbb
139+ ```
140+
141+ 上面命令中,` [!a] ` 表示文件名第二个字符不是` a ` 的文件名。
142+
143+ ## [ start-end] 模式
144+
145+ 方括号模式` [start-end] ` 可以表示一个连续的范围。
84146
85147``` bash
86148# 存在文件 a.txt、b.txt 和 c.txt
87149$ ls [a-c].txt
88- a.txt b.txt c.txt
150+ a.txt
151+ b.txt
152+ c.txt
89153
90154# 存在文件 report1.txt、report2.txt 和 report3.txt
91155$ ls report[0-9].txt
92- report1.txt report2.txt report3.txt
156+ report1.txt
157+ report2.txt
158+ report3.txt
159+ ...
93160```
94161
95162下面是更多的例子。
96163
164+ - ` [a-z] ` :所有小写字母。
165+ - ` [a-zA-Z] ` :所有小写字母与大写字母。
166+ - ` [a-zA-Z0-9] ` :所有小写字母、大写字母与数字。
97167- ` [abc]* ` :所有以` a ` 、` b ` 、` c ` 字符之一开头的文件名。
168+ - ` program.[co] ` :文件` program.c ` 与文件` program.o ` 。
98169- ` BACKUP.[0-9][0-9][0-9] ` :所有以` BACKUP. ` 开头,后面是三个数字的文件名。
99170
100- 方括号模式还有两种变体:` [^...] ` 和` [!...] ` 。它们表示匹配不在方括号里面的字符,这两种写法是等价的。比如,` [^abc] ` 或` [!abc] ` 表示匹配除了` a ` 、` b ` 、` c ` 以外的字符。
101-
102- ``` bash
103- $ ls ? [! a]?
104- aba bbb
105- ```
106-
107- 上面命令中,` [!a] ` 表示文件名第二个字符不是` a ` 的文件名。
108-
109- 这两种变体也可以使用连续范围的写法` [!start-end] ` 。
171+ 方括号模式的否定形式,也可以使用连续范围的写法` [!start-end] ` ,表示匹配不属于这个范围的字符。比如,` [!a-zA-Z] ` 表示匹配非英文字母的字符。
110172
111173``` bash
112174$ echo report[! 1–3].txt
@@ -117,7 +179,7 @@ report4.txt report5.txt
117179
118180## 大括号扩展
119181
120- 大括号扩展` {...} ` 表示分别输出大括号里面的所有值。大括号内部 ,各个值之间使用逗号分隔。
182+ 大括号扩展` {...} ` 表示分别输出大括号里面的所有值,各个值之间使用逗号分隔。这种扩展跟上面的扩展都不一样,不是文件名扩展,即不会扩展成文件名,而是扩展成所有给定的值 。
121183
122184``` bash
123185$ echo {1,2,3}
@@ -273,49 +335,6 @@ $ mkdir {2007..2009}-{01..12}
273335
274336上面命令会新建36个子目录,每个子目录的名字都是”年份-月份“。
275337
276- ## 波浪线扩展
277-
278- 波浪线` ~ ` 会自动扩展成当前用户的主目录。
279-
280- ``` bash
281- $ echo ~
282- /home/me
283- ```
284-
285- 如果要进入主目录的某个子目录,通常会把子目录放在波浪号后面。
286-
287- ``` bash
288- # 进入 /home/me/foo 目录
289- $ cd ~ /foo
290- ```
291-
292- 如果` ~ ` 后面是已经存在的用户名,则会返回该用户的主目录。
293-
294- ``` bash
295- $ echo ~ foo
296- /home/foo
297-
298- $ echo ~ root
299- /root
300- ```
301-
302- 上面例子中,Bash 会根据波浪号后面的用户名,返回该用户的主目录。
303-
304- 如果是不存在的用户名,则波浪号扩展不起作用。
305-
306- ``` bash
307- $ echo ~ nonExistedUser
308- ~ nonExistedUser
309- ```
310-
311- 此外,` ~+ ` 会返回当前所在的目录,等同于` pwd ` 命令。
312-
313- ``` bash
314- $ cd ~ /foo
315- $ echo ~ +
316- /home/me/foo
317- ```
318-
319338## 变量扩展
320339
321340Bash 将美元符号` $ ` 开头的词元视为变量,将其扩展成变量值。
0 commit comments