Bash本身并不会识别正则表达式. 在脚本中, 使用RE的是命令和工具 -- 比如sed和awk -- 这些工具能够解释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 |
Bash在通配(globbing)中解释特殊字符的行为是可以修改的.
set -f命令可以禁用通配(globbing),
而且shopt命令的选项 |
请参考例子 10-4.
[1] | 文件名扩展意味着扩展包含有特殊字符的文件名模式或模版. 比如, example.???可能会被扩展成example.001或(和)example.txt. | |
[2] | 文件名扩展能够匹配以"点"开头的文件, 但是, 你必须在模式字符串中明确的写上"点"(.), 才能够扩展.
|