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