Bash本身没有正则表达式的功能.在脚本里,使用正则表达式的是命令和软件包--例如sed和awk--它们可以解释正则表达式.Bash所做的是展开文件名扩展--这就是所谓的通配(globbing)--但它不是使用标准的正则表达式.而是使用通配符.通配解释标准的通配符:*和?,方括号括起来的字符,还有其他的一些特殊的字符(比如说^用来表示取反匹配).然而通配机制的通配符有很大的局限性.包含有*号的字符串将不会匹配以点开头的文件,例如.bashrc. 另外,通配机制的?字符和正则表达式中表示的意思不一样. bash$ls-l total2 -rw-rw-r-- 1bozo bozo 0Aug 618:42a.1 -rw-rw-r-- 1bozo bozo 0Aug 618:42b.1 -rw-rw-r-- 1bozo bozo 0Aug 618:42c.1 -rw-rw-r-- 1bozo bozo 466Aug 617:48t2.sh -rw-rw-r-- 1bozo bozo 758Jul3009:02test1.txt bash$ls-lt?.sh -rw-rw-r-- 1bozo bozo 466Aug 617:48t2.sh bash$ls-l[ab]* -rw-rw-r-- 1bozo bozo 0Aug 618:42a.1 -rw-rw-r-- 1bozo bozo 0Aug 618:42b.1 bash$ls-l[a-c]* -rw-rw-r-- 1bozo bozo 0Aug 618:42a.1 -rw-rw-r-- 1bozo bozo 0Aug 618:42b.1 -rw-rw-r-- 1bozo bozo 0Aug 618:42c.1 bash$ls-l[^ab]* -rw-rw-r-- 1bozo bozo 0Aug 618:42c.1 -rw-rw-r-- 1bozo bozo 466Aug 617:48t2.sh -rw-rw-r-- 1bozo bozo 758Jul3009:02test1.txt bash$ls-l{b*,c*,*est*} -rw-rw-r-- 1bozo bozo 0Aug 618:42b.1 -rw-rw-r-- 1bozo bozo 0Aug 618:42c.1 -rw-rw-r-- 1bozo bozo 758Jul3009:02test1.txt Bash会对命令行中没有引号引起来的字符尝试文件名扩展.echo命令可以印证这一点. bash$echo* a.1b.1c.1t2.shtest1.txt bash$echot* t2.shtest1.txt 可以改变Bash对通配字符进行解释的行为.set-f命令可以禁止通配机制,并且shopt的选项nocaseglob和nullglob能改变通配的行为.
上一篇:受限shell(Restricted Shells)_程序数据_shell
下一篇:shell中的移植话题_程序数据_shell