元字符是一种可以用来代表自身以外的内容的特殊字符,它们表达的是不同于字面本身的含义。
shell元字符也被称作“通配符”。
bash shell的元字符
元字符 含义
\ 按字面含义解释它后面那个字符
& 在后台处理的进程
; 分隔命令
$ 替换变量
? 匹配单个字符
[abc] 匹配这组字符中的一个
[!abc] 匹配这组字符以外的某个字符
* 匹配零个或多个字符
(cmds) 在子shell中执行命令
{cmds} 在当前shell中执行命令
元字符的作用
星号*:星号是一个通配符,它匹配文件名中零个或多个任意字符
1. $ ls *
abc abc1 abc123 file1.sh file2.sh nobody
说明:*被展开为当前工作目录下的所有文件的名称。所有的文件名都作为参数
传给ls并显示出来。
2. $ ls *.sh
file1.sh file2.sh
说明:匹配并列出所有以零个或多个字符开头并且以.sh结尾的文件名。
3. $ echo a*
abc abc1 abc123
说明:匹配所有以a开头后跟零个或多个字符的文件名,并将它们作为参数传
给echo命令。
问号?:问号代表文件名中某一个单个字符。当文件名中包含一个或多个问号时,shell把问号替换为在文件名中匹配到的字符,以这种方式来完成文件名替换。
1. $ ls
abc1 abc2 abc12 abc13
说明:列出当前目录下的文件。
2. $ ls a?c?
abc1 abc2
说明:匹配并列出以a开头,后跟一个字符,再跟字符c和一个字符的文件名。
3. $ ls ??
ls:??: No such file or directory
说明:如果找到正好由两个字符组成的文件名,就列出来。因为当前目录下没有
名为两个字符的文件,所以这两个问号被解释为由两个字面字符“?”组成的
文件名。如果没有找到这样的文件,就打印出一条错误信息。
4. $ echo abc??
abc12 abc13
说明:扩展以abc开头后跟正好3个字符的文件名,并用echo命令显示。
5. $ echo ??
??
说明:当前目录下没有名字正好是两个字符的文件。shell找不到匹配,就把问
号当成一个字面上的问号。
方括号:用于匹配包含指定字符组或字符范围内某个字符的文件名。
1. $ ls
abc abc122 abc2 file1.bak file2.bak nonsense nothing
one abc1 abc123 file1 file2 none noone nowhere
说明:列出当前目录下所有文件。
2. $ ls abc[123]
abc1 abc2
说明:匹配所有包含4个字符的文件名,列出以abc开头后跟1、2或3的文件
名。只匹配方括号中这组字符中的任一个。
3. $ ls abc[1-3]
abc1 abc2
说明:匹配所有包含4个字符的文件名。列出以abc开头,后跟一个1~3之间
数字的文件名。
4. $ ls [a-z][a-z][a-z]
abc one
说明:匹配所有包含3个字符的文件名,列出由3个小写字母组成的文件名。
5. $ ls [!f-z]???
abc1 abc2
说明:列出所有包含4个字符、第一个字符不是f至z之间的小写字母,后面是
3个任意字符的文件名,这里?代表一个字符。
6. $ ls abc12[23]
abc122 abc123
说明:列出文件名以abc12开头,后跟2或3的文件。
花括号:用来匹配一组用逗号分隔的字符串中的任一个。左花括号之前的所有字符称为前文,右花括号之后的所有字符称为后文。前文和后文都是可选的。花括号中不能包含不加引号的空白符。
1. $ ls
a.c b.c abc ab3 ab4 ab5 file1 file2 file3 file4 file5 foo faa fumble
说明:列出当前目录下的所有文件。
2. $ ls f{oo,aa,umble}
foo faa fumble
说明:匹配文件名以f开头,后跟括号中任一字符串(oo、aa或umble)的文件。
若在括号中加入了空格符,则会出现错误信息。
3. $ ls a{.c,c,b[3-5]}
a.c ab3 ab4 ab5
说明:匹配文件名以a开头,后跟括号中任一字符串的文件。
花括号中允许使用方括号
4. $ mkdir /usr/local/src/bash/{old,new,dist,bugs}
说明:在/usr/local/src/bash目录下创建4个新目录,
它们分别为:old,new,dist,bugs。
5. $ chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
说明:root用户权限将指派给/usr/ucb目录下的ex和edit文件,
以及/use/lib目录下的文件名以ex开头,后跟1个字符,一个句点,
一个或多个任意字符的文件名和名为how_ex的文件。
6. $ echo fo{o,um}*
fo{o,um}*
说明:只要括号中出现未加引号的空格就不对括号进行扩展。
7. $ echo {man,pap,ba}a
mana papa baa
说明:括号扩展不见得总是扩展文件名。本例中,括号后的字符a
被添加到括号中的每个字符串后面并在结果中显示。
8. $ echo post{script,office,ure}
postscript postoffice posture
说明:前缀是一个字符串,后跟由括号括着的以逗号分隔的字符串。
括号扩展已被执行并在结果中显示。
转义字符:反斜杠用于屏蔽某一单个字符的特殊含义。被转义的字符将只代表其本身。
1. $ ls
abc file1 youx
说明:列出当前目录下的所有文件(注意youx文件)。
2. $ echo How are you?
How are youx
注意:shell对?执行文件名扩展。匹配当前目录下所有以you开头,
后面有且只有一个字符的文件名,把它们替换到字符串中。
文件名youx将被替换到字符串中,把字符串变成:How are youx
3. $ echo How are you\?
How are you?
注意:在问号前面加一个反斜杠,问号就被转义了,
这意味着shell不会把它当作通配符来解释。
4. $ echo When dose this line \
> ever end\?
When does this line ever end?
注意:在换行符前面加一个反斜杠将其转义。
次提示符将一直出现直到字符串被换行符终止。