一、语法
1.1、通配符
“*”:匹配任意字符串,包括空字符串,不包含对“/”字符的匹配。
“?”:匹配任意单个字符,不能匹配“/”字符。
1.2、字符类
“[abc]”:匹配“a”或者“b”或者“c”字符。
“[!abc]”:匹配除了“a,b,c”这3个字符之外的任意一个字符。
备注:
字符类内不包含对“/”字符的匹配。
1.3、字符范围
“[a-z]”:匹配26个英文小写字符中任意一个。
“[!a-z]”:匹配除了“26个英文小写字符”之外的任意一个字符。
备注:
字符范围内不包含对“/”字符的匹配。
二、实验
当前目录结构如下:
1
2
3
4
5├── 10.txt
├── 1.txt
├── aa.txt
├── a.txt
├── c
2.1、实验1
执行ls *.txt命令,得到:
110.txt 1.txt aa.txt a.txt
2.2、实验2
执行ls ?.txt命令,得到:
11.txt a.txt
2.3、实验3
执行ls [0-9].txt命令,得到:
11.txt
2.4、实验4
执行ls [012].txt命令,得到:
11.txt
2.5、实验5
执行ls [!0-9].txt命令,得到:
1a.txt
2.6、实验6
执行ls [!789]?.txt命令,得到:
110.txt aa.txt
三、其他
3.1、“locale”设置影响
“字符范围”所能匹配的字符跟“locale”设置息息相关。比如在有些“locale”设置中,“[a-d]”等价于“abcd”,而在有些“locale”设置中,“[a-d]”等价于“[aBbCcDd]”。
3.2、一个匹配特殊点
想要使用“Linux Shell通配符模式表达式”匹配以“.”开头的文件,对于该开头“.”字符:必须显式指定“.”字符进行匹配,尝试使用“通配符”,“字符类”,“字符范围”匹配该开头“.”字符会失败。
比如在当前目录下有一个“.a.txt”文件,使用如下类似命令都不能打印该文件:
1
2
3ls *
ls [.]*
ls [.-9]*
只有使用如下类似命令才能打印该文件:
1
2
3ls .*
ls .[a]*
ls .[a-z]*
参考文献:
[1]man 7 glob
[2]man 3 glob
[3]man sh
[4]man bash
[5]http://stackoverflow.com/questions/43862113/what-is-returned-after-pathname-expansion-in-shell?noredirect=1#comment74803794_43862113