首页 >> 学习 >> Shell脚本编程基础 >> 通配符
通配符

本节重要性:★★★★★    本节难度:★★★★★

假设您的桌面上有两本书《生物信息学》和《基因组学》,还有两支笔和一个手机。现在让您拿走桌面的书,您就会把两本书《生物信息学》和《基因组学》拿走,而不会去拿笔和手机。这里,"书"是一类事物的统称,代表《生物信息学》和《基因组学》,而不能代表笔和手机。

Shell里的通配符的含义与此类似,就是我们可以用一个包含通配符的模式,代表一类字符串。Shell的通配符有:

*		表示任意个任意字符
?		表示1个任意字符
[字符集合]	表示方括号中的任意1个字符,如[13579],[acfh]
[字符范围]	表示某一范围的字符,如[0-9],[a-z]
!或^		用在字符集合或字符范围左方括号的后面,表示反向选择,
		如[!3-9]表示除了3-9以外的字符

如果*和?出现在字符集合中,就失去了通配符的作用,只是星号和问号本身。在字符范围中,-表示范围,那么想在字符集合中表示-本身怎么办呢?您只需要把-放在字符集合的开始或最后就可以了。

通配符的使用方法如下:

[peter@ibi-genome alias]$ ll
总用量 8
drwxrwxr-x 2 peter peter 4096  4月 28 10:43 alias
-rw-rw-r-- 1 peter peter    0  4月 28 19:38 file_1.txt
-rw-rw-r-- 1 peter peter    0  4月 28 19:38 file1.txt
-rw-rw-r-- 1 peter peter    0  4月 28 19:38 file2.txt
-rw-rw-r-- 1 peter peter    0  4月 28 19:39 file3.txt
-rw-rw-r-- 1 peter peter   24  4月 28 10:33 test.sh
[peter@ibi-genome alias]$ ll file*
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file_1.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file1.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file2.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:39 file3.txt
[peter@ibi-genome alias]$ ll file?.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file1.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file2.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:39 file3.txt
[peter@ibi-genome alias]$ ll file[1-3]*
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file1.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file2.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:39 file3.txt
[peter@ibi-genome alias]$ ll file[13]*
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file1.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:39 file3.txt
[peter@ibi-genome alias]$ ll file[^1]*
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file_1.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file2.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:39 file3.txt

Bash除了支持上面的通配符,还支持下面的模式表达式:

*(模式1|模式2...)	0次、1次或多次出现任意一模式
+(模式1|模式2...)	1次或多次出现任意一模式
?(模式1|模式2...)	0次或1次出现任意一模式
@(模式1|模式2...)	1次出现任意一模式
!(模式1|模式2...)	除1次出现任意一模式外的任何字符串

模式表达式的使用方法如下:

[peter@ibi-genome alias]$ ll
总用量 4
-rw-rw-r-- 1 peter peter  0  4月 28 20:07 file
-rw-rw-r-- 1 peter peter  0  4月 28 19:38 file_1.txt
-rw-rw-r-- 1 peter peter  0  4月 28 19:38 file1.txt
-rw-rw-r-- 1 peter peter  0  4月 28 19:38 file2.txt
-rw-rw-r-- 1 peter peter  0  4月 28 19:39 file3.txt
-rw-rw-r-- 1 peter peter  0  4月 28 20:02 file.c
-rw-rw-r-- 1 peter peter  0  4月 28 20:02 file.pl
-rw-rw-r-- 1 peter peter  0  4月 28 20:08 file.pl.pl
-rw-rw-r-- 1 peter peter 24  4月 28 10:33 file.sh
-rw-rw-r-- 1 peter peter  0  4月 28 20:01 file.txt
[peter@ibi-genome alias]$ ll file*(.pl|.sh)
-rw-rw-r-- 1 peter peter  0  4月 28 20:07 file
-rw-rw-r-- 1 peter peter  0  4月 28 20:02 file.pl
-rw-rw-r-- 1 peter peter  0  4月 28 20:08 file.pl.pl
-rw-rw-r-- 1 peter peter 24  4月 28 10:33 file.sh
[peter@ibi-genome alias]$ ll file+(.pl|.sh)
-rw-rw-r-- 1 peter peter  0  4月 28 20:02 file.pl
-rw-rw-r-- 1 peter peter  0  4月 28 20:08 file.pl.pl
-rw-rw-r-- 1 peter peter 24  4月 28 10:33 file.sh
[peter@ibi-genome alias]$ ll file?(.pl|.sh)
-rw-rw-r-- 1 peter peter  0  4月 28 20:07 file
-rw-rw-r-- 1 peter peter  0  4月 28 20:02 file.pl
-rw-rw-r-- 1 peter peter 24  4月 28 10:33 file.sh
[peter@ibi-genome alias]$ ll file@(.pl|.sh)
-rw-rw-r-- 1 peter peter  0  4月 28 20:02 file.pl
-rw-rw-r-- 1 peter peter 24  4月 28 10:33 file.sh
[peter@ibi-genome alias]$ ll file!(.pl|.sh)
-rw-rw-r-- 1 peter peter 0  4月 28 20:07 file
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file_1.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file1.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:38 file2.txt
-rw-rw-r-- 1 peter peter 0  4月 28 19:39 file3.txt
-rw-rw-r-- 1 peter peter 0  4月 28 20:02 file.c
-rw-rw-r-- 1 peter peter 0  4月 28 20:08 file.pl.pl
-rw-rw-r-- 1 peter peter 0  4月 28 20:01 file.txt

有了通配符和模式表达式,我们就可以一次操作多个文件,比如rm file*就删除当前目录下所有以file开头的文件(除非您知道自己在干什么,否则不要乱用rm *)。

<<上一节  下一节>>