通配符是特殊的字符,用来告诉 Shell 要匹配的规则。如果你有使用 DOS 的经验,你会认出 *
是用来匹配任何东西的通配符。bash 使用通配符来让你更容易地做你想做的事情。
第一个也是最常用的就是 *
。星号匹配任何字符和字符的组合,包括空。因此 b*
会匹配任何以 b
开头的文件,比如 b
,ba
,babc
等等。不怎么常用的是 ?
。这个字符只匹配单个字符。所以 b?
会匹配 ba
,bb
等,而不会匹配 b
,bab
。
darkstar:~$ touch b ba bab
darkstar:~$ ls *
b ba bab
darkstar:~$ ls b?
ba
不,有趣的地方还不至于此。除了这两个外,我们还有方括号 []
。方括号允许我们匹配方括号中的字符。当 bash 看到方括号时,它会替换方括号中的内容。任何字符和数字的组合都可以被指定,用逗号分隔它们。同样的,字符和数字的范围也可以指定。下面举例。
darkstar:~$ ls a[1-4,9]
a1 a2 a3 a4 a9
因为 Linux 是区分大小写的,大写和小写的字母不同。在 ASCII 顺序中,大写字母都是位于小写字母之前的。因此当要表示包含大写字母和小写字母的范围时,请确保正确。
darkstar:~$ ls 1[W-b]
1W 1X 1Y 1Z 1a 1b
darkstar:~$ ls 1[w-B]
/bin/ls: cannot access 1[b-W]: No such file or directory
在第二个案例中,1[w-B]
是错误的范围,所以 shell 将其认为是文件名,因为没有那个文件所以告诉你不存在。