1.5.4 通配符
在 Shell 中除使用普通字符外,还可以使用一些具有特殊含义和功能的字符,称为通配符,在使用它们时应注意其特殊的含义和作用范围。
Shell的通配符主要用于模式匹配,如文件名匹配、路径名搜索、字串查找等。常用的通配符有“*”、“ ”和括在方括号“[ ]”中的字符序列等,用户可以在作为命令参数的文件名中包含这些通配符,构成一个所谓的“模式串”,进而在执行过程中进行模式匹配。这3个通配符的含义分别如下:
“*”代表任意长度的字串,例如“L*”匹配以L开头的任意字串。但应注意,文件名中的圆点(.)和路径名中的斜线(/)必须是显式的,即不能用通配符替代它们。例如“*”不能匹配.c,而“.*”才可以匹配.c。
“ ”代表任何单个字符。
“[ ]”指定了模式串匹配的字符范围,只要文件名中“[ ]”处的字符在指定的范围之内,那么这个文件名就与该模式串匹配。方括号中的字符范围可以由字符串组成,也可以由表示限定范围的起始字符、终止字符及中间连字符“-”组成。例如,f [a-d]与f [abcd]的作用相同。
Shell将把与命令行中指定的模式串相匹配的所有文件名都作为命令的参数,形成最终的命令,然后再执行这个命令。如果目录中没有与指定的模式串相匹配的文件名,那么Shell将使用此模式串本身作为参数传给命令(这正是命令中出现特殊字符的原因所在)。表 1.1 列举了这些通配符的具体实例及含义。
表1.1 通配符的含义
需要注意的是,中间连字符“-”仅在方括号内有效,表示字符范围,若在方括号外面,就成为普通字符了。而“*”和“ ”则只在方括号外有效,若出现在方括号之内,它们也失去通配符的能力,成为普通字符了。例如,模式L[* ]abc中只有一对方括号是通配符,而“*”和“ ”均为普通字符,因此,它匹配的字串只能是L*abc和L abc。
由于“*”、“ ”和“[ ]”对于Shell来说具有比较特殊的意义,因此在文件名中不应出现这些字符,特别是在目录名中不要出现它们,否则可能导致Shell无穷递归地进行匹配。