@@ -51,7 +51,7 @@ $ echo ~+
5151
5252## ` ? ` 字符扩展
5353
54- ` ? ` 字符代表任意的单个字符 ,不包括空字符。比如,` Data??? ` 匹配所有` Data ` 开头后面跟着三个字符的文件名。
54+ ` ? ` 字符代表文件路径里面的任意单个字符 ,不包括空字符。比如,` Data??? ` 匹配所有` Data ` 开头后面跟着三个字符的文件名。
5555
5656``` bash
5757# 存在文件 a.txt 和 b.txt
@@ -87,7 +87,7 @@ $ echo ?.txt
8787
8888## ` * ` 字符扩展
8989
90- ` * ` 字符代表任意数量的字符 ,包括零个字符。
90+ ` * ` 字符代表文件路径里面的任意数量字符 ,包括零个字符。
9191
9292``` bash
9393# 存在文件 a.txt、b.txt 和 ab.txt
@@ -121,15 +121,23 @@ $ echo .[!.]*
121121
122122## 方括号模式
123123
124- 方括号模式是` [...] ` ,可以匹配方括号之中的任意一个字符,比如` [aeiou] ` 可以匹配五个元音字母中的任意一个。
124+ 方括号模式是` [...] ` ,可以匹配方括号之中的任意一个字符,比如` [aeiou] ` 可以匹配五个元音字母中的任意一个。该模式属于文件名匹配,即匹配后的结果必须符合现有的文件路径,如果不存在匹配,就会保持原样,不进行扩展。
125125
126126``` bash
127127# 存在文件 a.txt 和 b.txt
128128$ ls [ab].txt
129129a.txt b.txt
130+
131+ # 只存在文件 a.txt
132+ $ ls [ab].txt
133+ a.txt
134+
135+ # 不存在文件 a.txt 和 b.txt
136+ $ ls [ab].txt
137+ ls: 无法访问' [ab].txt' : 没有那个文件或目录
130138```
131139
132- 上面命令中,` [ab] ` 表示可以扩展成` a ` 或` b ` 。
140+ 上面命令中,` [ab] ` 表示可以扩展成` a ` 或` b ` 。具体的执行结果,取决于当前目录是否包含指定的文件。
133141
134142方括号模式还有两种变体:` [^...] ` 和` [!...] ` 。它们表示匹配不在方括号里面的字符,这两种写法是等价的。比如,` [^abc] ` 或` [!abc] ` 表示匹配除了` a ` 、` b ` 、` c ` 以外的字符。
135143
@@ -233,7 +241,7 @@ $ echo {cat,dog}
233241cat dog
234242```
235243
236- 大括号模式` {...} ` 与方括号模式` [...] ` 有一个很重要的区别。如果匹配的文件不存在,` [...] ` 会失去模式的功能,变成一个单纯的字符串,而` {...} ` 依然可以展开。
244+ 大括号模式` {...} ` 与方括号模式` [...] ` 有一个很重要的区别。如果匹配的文件不存在,` [...] ` 会失去模式的功能,变成一个单纯的字符串,而` {...} ` 依然可以展开,因为大括号不是文件名扩展 。
237245
238246``` bash
239247# 不存在 a.txt 和 b.txt
@@ -246,6 +254,8 @@ a.txt b.txt
246254
247255上面代码中,如果不存在` a.txt ` 和` b.txt ` ,那么` [ab].txt ` 就会变成一个普通的文件名,而` {a,b}.txt ` 可以照样展开。
248256
257+ ## {start..end} 扩展
258+
249259大括号里面两个点的` {start..end} ` 模式,表示扩展成一个连续序列,然后分别输出。比如` {a..z} ` 可以扩展成26个小写英文字母,然后输出。
250260
251261``` bash
@@ -265,6 +275,16 @@ $ echo Number_{1..5}
265275Number_1 Number_2 Number_3 Number_4 Number_5
266276```
267277
278+ 大括号的双点号支持逆序。
279+
280+ ``` bash
281+ $ echo {5..1}
282+ 5 4 3 2 1
283+
284+ $ echo {E..A}
285+ E D C B A
286+ ```
287+
268288如果遇到无法解释的扩展,模式会原样输出。
269289
270290``` bash
@@ -279,6 +299,14 @@ $ echo .{mp{3..4},m4{a,b,p,v}}
279299.mp3 .mp4 .m4a .m4b .m4p .m4v
280300```
281301
302+ 大括号扩展的常见用途为新建一系列目录。
303+
304+ ``` bash
305+ $ mkdir {2007..2009}-{01..12}
306+ ```
307+
308+ 上面命令会新建36个子目录,每个子目录的名字都是”年份-月份“。
309+
282310整数前面可以使用前导` 0 ` ,然后输出的每一项都有前导` 0 ` 。
283311
284312``` bash
@@ -298,24 +326,11 @@ $ echo {0..8..2}
298326
299327上面代码将` 0 ` 扩展到` 8 ` ,每次递增的长度为` 2 ` ,所以一共输出5个数字。
300328
301- 大括号的双点号还支持逆序。
302-
303- ``` bash
304- $ echo {5..1}
305- 5 4 3 2 1
306-
307- $ echo {E..A}
308- E D C B A
309- ```
310-
311329多个大括号连用,会有循环处理的效果。
312330
313331``` bash
314332$ echo {a..c}{1..3}
315333a1 a2 a3 b1 b2 b3 c1 c2 c3
316-
317- $ echo a{A{1,2},B{3,4}}b
318- aA1b aA2b aB3b aB4b
319334```
320335
321336这个写法可以直接用于` for ` 循环。
327342done
328343```
329344
330- 大括号扩展的常见用途为新建一系列目录。
331-
332- ``` bash
333- $ mkdir {2007..2009}-{01..12}
334- ```
335-
336- 上面命令会新建36个子目录,每个子目录的名字都是”年份-月份“。
337-
338345## 变量扩展
339346
340347Bash 将美元符号` $ ` 开头的词元视为变量,将其扩展成变量值。
0 commit comments