Shell命令行中特殊字符与其转义详解(去除特殊含义)
特殊符号及其转义 大家都知道在一个shell命令是由命令名和它的参数组成的,比如 比如说,如果你的当前目录有file,file1,file2 三个文件,那么当你执行cat file*的时候,shell会对参数部分file*进行预先处理,由于*表示任意多个(包括0个)任意字符,那么处理的结果便是file file1 file2,接下来,shell再将这个结果,即file file1 file2传递给cat命令,所以你看到的结果跟直接执行cat file file1 file2是一样的,那就是三个文件的内容都显示在命令行终端. 实际上,我们有办法看到shell处理的结果是什么,或者说真正执行的命令是什么样子的,那就是在你要执行的命令之前加上echo. cat file file1,file2 上面那条命令,就是经过shell对参数的处理之后,真正执行的命令. 但是很多时候,我们希望传递给这些命令的,就是这些参数本身,比如说,你当前目录下有一个文件的文件名就叫test*,同时还有另外一个文件,test1. 而你只想看test*的内容,这时候,如果你执行 cat test* 的话,那么test*和test1的内容都会被显示出来,这时候怎么办呢? 这里就涉及到特殊字符的转义(escape)的问题了.所谓的转义,意思就是去掉它的特殊含义.让shell把他们当做一般字符对待,不要进行特殊处理. 在shell中,特殊字符的转义有三种办法
在上面的例子中,这三种方法都是有效率的,也就是说,下面的三个命令都能达到目的:
三种转义方法的范围 在shell中,特殊字符是非常多的,而以上提到的三种转义方法的范围也不尽相同,其中第一种方法的范围是最广的,几乎可以对所有的特殊字符进行转义,常见的用法是把\放在一个命令行的最后,这样一个很长的命令就可以分为两行或者更多行写. 比如 echo this is a \ very long \ line 将显示成 this is a very long line 在这里,其实就是\把换行符转义了,让它失去了换行的意思,同时阻止命令立刻执行. 第二种转义(单引号)的范围比第一种小,它可以阻止命令行立刻执行,但是它不能让换行符失去换行的意思. 所以 echo 'hello world' 将显示成 hello world 第三种转义(双引号)的范围又比第二种小,单引号可以转义"`",而双引号不行. 在shell中,"`"中间的东西将被视为命令替换. shell对参数进行预先处理时,将把两个"`"中间的东西当做shell命令进行执行,再将执行结果替换掉他们本身. 举个例子: echo today is `date` 将显示 today is Mon Oct 12 16:14:16 CST 2015 当然,具体的日期跟你执行这条命令的时期有关. 总之,意思你应该明白了. 再回到原来的问题,我们说单引号可以转义"`",而双引号不行,意思就是,单引号之间的"`"将失去它的特殊含义,而双引号之间的"`"将依然有特殊含义,所以 echo 'today is `date`' 将显示 today is `date` 而 echo “today is `date`” 将显示 today is Mon Oct 12 16:23:23 CST 2015 常见的一些特殊字符
最后记得,任何时候,你不确定自己是不是转义对了,或者是特殊字符用对了,记得可以在命令前面加上 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。 (编辑:ASP站长网) |