> For the complete documentation index, see [llms.txt](https://slackwarecn.gitbook.io/slackbook_cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://slackwarecn.gitbook.io/slackbook_cn/chapter_05/wildcards.md).

# 通配符

通配符是特殊的字符，用来告诉 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 将其认为是文件名，因为没有那个文件所以告诉你不存在。
