Shell命令⾏中特殊字符与其转义详解(去除特殊含义)
特殊符号及其转义
⼤家都知道在⼀个shell命令是由命令名和它的参数组成的, ⽐如 cat testfile, 其中cat是命令名, testfile是参数. shell将参数testfile传递给cat 命令. 但是, 如果参数中含有特殊字符, ⽐如说*, *我们知道,是表⽰任意多个(包括0个)任意字符. 那么shell的⼯作⽅式是,它会对这些特殊字符进⾏预先处理, 然后再将处理的结果传给那个命令.
⽐如说,如果你的当前⽬录有file, file1, file2 三个⽂件, 那么当你执⾏cat file*的时候, shell会对参数部分file*进⾏预先处理, 由于*表⽰任意多个(包括0个)任意字符,那么处理的结果便是file file1 file2,接下来,shell再将这个结果, 即file file1 file2传递给cat命令, 所以你看到的结果跟直接执⾏cat file file1 file2是⼀样的, 那就是三个⽂件的内容都显⽰在命令⾏终端.
实际上,我们有办法看到shell处理的结果是什么,或者说真正执⾏的命令是什么样⼦的, 那就是在你要执⾏的命令之前加上echo.
⽐如说,在上⾯的⽬录下,你执⾏echo cat file* , 那么你将看到
1cat file file1, file2
上⾯那条命令,就是经过shell对参数的处理之后,真正执⾏的命令.
但是很多时候,我们希望传递给这些命令的,就是这些参数本⾝, ⽐如说,你当前⽬录下有⼀个⽂件的⽂件名就叫test*, 同时还有另外⼀个⽂件, test1. ⽽你只想看test*的内容, 这时候,如果你执⾏
1cat test*
的话,那么test*和test1的内容都会被显⽰出来,这时候怎么办呢? 这⾥就涉及到特殊字符的转义(escape)的问题了.所谓的转义,意思就是去掉它的特殊含义.让shell把他们当做⼀般字符对待,不要进⾏特殊处理.
在shell中,特殊字符的转义有三种办法
1. ⽤\转义: 把\字符放在特殊字符的前⾯
2. ⽤单引号('')转义: ⽤单引号把参数括起来
3. ⽤双引号("")转义: ⽤双引号把参数括起来
在上⾯的例⼦中,这三种⽅法都是有效率的,也就是说,下⾯的三个命令都能达到⽬的:
1. cat test\*
2. cat 'test*'
3. cat “test*”
三种转义⽅法的范围
在shell中,特殊字符是⾮常多的,⽽以上提到的三种转义⽅法的范围也不尽相同,其中第⼀种⽅法的范围是最⼴的,⼏乎可以对所有的特殊字符进⾏转义,常见的⽤法是把\放在⼀个命令⾏的最后,这样⼀个很长的命令就可以分为两⾏或者更多⾏写. ⽐如
1 2 3echo this is a \ very long \ line
将显⽰成
1this is a very long line
在这⾥,其实就是\把换⾏符转义了,让它失去了换⾏的意思,同时阻⽌命令⽴刻执⾏.
第⼆种转义(单引号)的范围⽐第⼀种⼩,它可以阻⽌命令⾏⽴刻执⾏,但是它不能让换⾏符失去换⾏的
意思. 所以
1 2echo'hello world'
将显⽰成
1 2hello world
第三种转义(双引号)的范围⼜⽐第⼆种⼩,单引号可以转义"`", ⽽双引号不⾏. 在shell中, "`"中间的东西将被视为命令替换. shell对参数进⾏预先处理时,将把两个"`"中间的东西当做shell命令进⾏执⾏,再将执⾏结果替换掉他们本⾝. 举个例⼦:
1echo today is `date`
将显⽰
1today is Mon Oct 12 16:14:16 CST 2015
当然,具体的⽇期跟你执⾏这条命令的时期有关. 总之,意思你应该明⽩了. 再回到原来的问题,我们说单引号可以转义"`", ⽽双引号不⾏, 意思就是,单引号之间的"`"将失去它的特殊含义,⽽双引号之间的"`"将依然有特殊含义,所以
1echo'today is `date`'
将显⽰
1today is `date `
⽽
1echo“today is `date`”
将显⽰
1today is Mon Oct 12 16:23:23 CST 2015
常见的⼀些特殊字符
1. * 任意个任意字符
2. ? ⼀个任意字符
3. [..] []中的任意⼀个字符,这⾥也类似于正则表达式,中括号内可以是具体的⼀些字符,如[abcd]也可以是⽤-指定的⼀个范围,如[a-d]shell命令属于什么语言
4. # 注释
5. (空格) 参数分隔符
6. cmd 命令替换
7. | 管道
8. & 后台执⾏
9. ; 命令分隔符(可以在同⼀⾏执⾏两个命令,⽤;分割)
10. ~ ⽤户home⽬录
最后记得,任何时候,你不确定⾃⼰是不是转义对了,或者是特殊字符⽤对了,记得可以在命令前⾯加上echo,来看看真实执⾏的命令是怎么样的posted @ 2017-06-03 16:29 阅读( ...) 评论( ...)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论