19.2. 通配(globbing)

Bash本身并不会识别正则表达式. 在脚本中, 使用RE的是命令和工具 -- 比如sedawk -- 这些工具能够解释RE.

Bash仅仅做的一件事是文件名扩展(译者注: 作者在前面使用的名词是filename globbing, 这里又使用filename expansion, 造成术语不统一, 希望读者不要产生误解.) [1] -- 这就是所谓的通配(globbing) -- 但是这里所使用的并不是标准的RE, 而是使用通配符. 通配(globbing)解释标准通配符, *, ?, 中括号扩起来的字符, 还有其他一些特殊字符(比如^用来表示取反匹配). 然而通配(globbing)所使用的通配符有很大的局限性. 包含*的字符串不能匹配以"点"开头的文件, 比如, .bashrc. [2] 另外, RE中所使用的?, 与通配(globbing)中所使用的?, 含义并不相同.

bash$ ls -l
total 2
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
 -rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh
 -rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt

bash$ ls -l t?.sh
-rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh

bash$ ls -l [ab]*
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1

bash$ ls -l [a-c]*
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1

bash$ ls -l [^ab]*
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
 -rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh
 -rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt

bash$ ls -l {b*,c*,*est*}
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
 -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
 -rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt
	      

Bash只能对未用引号引用起来的命令行参数进行文件名扩展. echo命令可以印证这一点.

bash$ echo *
a.1 b.1 c.1 t2.sh test1.txt

bash$ echo t*
t2.sh test1.txt
	      

Note

Bash在通配(globbing)中解释特殊字符的行为是可以修改的. set -f命令可以禁用通配(globbing), 而且shopt命令的选项nocaseglobnullglob可以修改通配(globbing)的行为.

请参考例子 10-4.

注意事项

[1]

文件名扩展意味着扩展包含有特殊字符的文件名模式或模版. 比如, example.???可能会被扩展成example.001或(和)example.txt.

[2]

文件名扩展能够匹配以"点"开头的文件, 但是, 你必须在模式字符串中明确的写上"点"(.), 才能够扩展.
  1 ~/[.]bashrc    #  不能扩展成~/.bashrc
  2 ~/?bashrc      #  也不能扩展. 
  3                #  通配(globbing)中所使用的通配符
  4                #+ 和匹配字符串"不能"扩展"点". 
  5 
  6 ~/.[b]ashrc    #  可以扩展成~/.bashrc
  7 ~/.ba?hrc      #  也可以扩展.
  8 ~/.bashr*      #  也可以扩展.
  9 
 10 # 可以设置"dotglob"选项, 把这个特性关闭. 
 11 
 12 # 感谢, S.C.