linux中的通配符、元字符、转义符
shell命令的构成
每条linux命令中的每个character都是以下两种之一:
- literal:普通纯文本
- 保留字:通配符、元字符、转义字符
通配符
通配符是由shell处理的(不是由所涉及到命令语句处理的,其实我们在shell各个命令中也没有发现有这些通配符介绍), 它只会出现在命令的“参数”里(它不用在命令名称里,也不用在操作符上)。当shell在“参数”中遇到了通配符时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符实际上就是一种shell实现的路径扩展功能。在通配符被处理后, shell会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。
通配符和正则表达式看起来很像,但其实不同,它只是shell的特殊字符而已。
*
:匹配0或多个字符?
:匹配任意一个字符[list]
:匹配list中的任意单一字符[!list]
:匹配非list中的任意单一字符[a1-a3]
:匹配a1和a3之间的任意一个字符,如0-9,a-z{string1,string2,string3...}
:匹配string1,或string2或……其中的一个字符串
元字符meta
IFS
:由<space><tab><enter>
三者之一组成,用来拆分command line中的wordCR
:由<enter>
产生,用来结束一条command line=
:赋值$
:变量替换>
:stdout<
:stdin|
:管道命令&
:重定向file descriptor,或将命令置于后台执行`
:用于替换()
:将命令置于nested subshell中执行,或用于运算或命令替换{}
:将命令置于non-named function中执行,或用于变量替换的界定范围;
:在一个命令结束时,忽略其返回值,继续执行吓一条命令&&
:在一个命令结束时,若返回值为true,继续执行下一个命令||
:在一个命令结束时,若返回值为false,继续执行下一个命令!
:执行history列表中的命令
转义符
当我们要关闭meta的功能时,就用到了转义符。
'
(单引号)hard quote,凡在hard quote中的所有meta都被关闭。"
(双引号)soft quote,在soft quote中的大部分meta都会被关闭,但保留某些meta的功能(如$)。\
(反斜线)escape,只有紧接在escape(跳脱字符)之后的单一meta才会被关闭。
dquote中不被关闭的meta:$
,反引号`
,反斜杠\
。
example
➜ ~ ls -d P* # 以P开头的文件
Pictures Projects Public
➜ ~ A=B C #<space>未被关闭,作为IFS处理。
zsh: command not found: C
➜ ~ A="B C" #<space>在"中被关闭,当作普通字符使用
➜ ~ echo $A
B C
➜ ~ A="B
dquote> C
dquote> " #<Enter>在"中被关闭,当作普通字符使用,由于command line没有得到CR字符,因此进入第二个shell prompt(以>符号表示)。
➜ ~ echo $A
B
C
➜ ~ A=B\ C # \使<space>的功能关闭,仅当普通空格使用
➜ ~ echo '$A' # $在squote中功能关闭,仅作literal
$A
➜ ~ echo "$A" # $在dquote中功能未关闭,作meta用
B C
➜ ~ echo \$A
$A
➜ ~
reference
http://www.cnblogs.com/chengmo/archive/2010/10/17/1853344.html
http://bbs.chinaunix.net/thread-2076396-1-1.html