- 论坛徽章:
- 1
|
edsionte 发表于 2012-02-07 21:22
无人回复么。 先看看反引号内部的结果。
外面没有被引号引起来的backslash,\,符号在Bash当中是escape character,作用是保留了下一个字符的字面含义。注意,仅仅是\后的一个字符。作出这种解析的是Bash,而不是echo程序。- $ echo \z
- z
- # 这里好理解吧,\z被Bash解析为z,然后echo就直接显示啦
- $ echo \\z
- \z
- # 上面的\\被Bash解释为\,而z就是z啦
- $ echo \\\z
- \z
- # 上面的\\被Bash解析为\,然后\z被解析为z,连起来就是\z啦
- $ echo \\\\z
- \\z
- # 上面的\\被Bash解析为\,然后后面两个\\被解析为\,然后就是z,然后连起来就是\\z
- $ echo \\\\\\z
- \\\z
- # 情况类似,\和它后面的一个字符组合,保留它后面一个字符的字面意义,得到\\\,然后最后是z,最后连起来就是\\\z
- $ echo \\\\\\\z
- \\\z
- # 上面的也是,\\\\\\被Bash解释为\\\,然后是\z被解释为z,最后连起来就是\\\z,然后交给echo就直接显示啦,
- # 上面的所有echo显示都会在后面追加一个换行的
复制代码 上面的只是让你知道没有被引号(单引号,双引号,反引号)引起来的backslash在Bash当中的解析。如果是被引号(双引号和反引号,除了单引号,单引号里面是什么就是什么,Bash不会重新过滤)引起来的backslash,
在Bash当中是这么解析的,如果backslash后面的一个字符是dollar, backtick, double quote, backslash or newline,这个前导的backslash将被Bash移除(从输入流当中就处理了),而dollar,backtick,double quote,backslash or newline将保留它们本身的含义。
再来看看你的例子,外层echo显示需要获取输入显示的内容,由于你的例子里面有反引号,所以Bash先在input stream当中进行过滤一遍。这里是你的输入:- echo `echo \z` # z
- echo `echo \\z` # z
- echo `echo \\\z` # \z
- echo `echo \\\\z` # \z
- echo `echo \\\\\\z` # \z
- echo `echo \\\\\\\z` # \\z
复制代码 过滤后- echo `echo \z`
- # 上面的前导\没有移除,因为z不属于dollar, backtick, double quote, backslash or newline当中
- echo `echo \z`
- # \\当中的前导\被移除
- echo `echo \\z`
- # \\当中的前导被移除,\z不变
- echo `echo \\z`
- # \\\\两个前导被移除,得到\\,z就是z,连接起来是\\z
- echo `echo \\\z`
- # 移除三个前导,得到\\\z
- echo `echo \\\\z`
- # 移除三个前导,得到\\\,然后后面是\z,不变,连起来是\\\\z
复制代码 执行反引号里面的echo,这里按照帖子开头说的escape character进行解析,然后就是你要的结果了。- $ echo \z
- z
- $ echo \z
- z
- $ echo \\z
- \z
- $ echo \\z
- \z
- $ echo \\\z
- \z
- $ echo \\\\z
- \\z
复制代码 主要还是要分清楚escape character以及引号当中的backslash的区别,这个就容易理解了。escape character一律对后面的字符保留字面意思,而引号(除单引号)当中的backslash碰到后面是
dollar, backtick, double quote, backslash or newline五种字符时,Bash会把前导的backslash移除,后面的那个字符保留原本含义。
上面部分是一些个人理解,不对之处,还望指正。
|
|