对于shell的转义的问题,查看了好多文章都是针对于转义本身用法的,却没有说明在命令中的用法问题,实际上我们在使用转义时大多是在grep等各种命令之中,博主特意进行了一些研究实验,针对多层转义的问题得出了一些有用的结论,有兴趣的小伙伴可以一起来探讨。
首先对转义进行一个简单说明:
meta是元语言的意思,即当前命令作用域下的特殊含义字符,包括空格,$,',",\等等,主要是区分为命令meta和shellmeta,而且在不同的命令作用域下meta是不同的。
针对shell命令行作用域下:
无引号将先处理所有shell的meta。
单引号为硬转义,shell的meta在内部应无效。
双引号为软转义,大部分shellmeta无效,但$,\,`不会失效。
下面先给出博主试验后得出的结论:
多层转义原理:在命令中使用引号例如grep时,它的转义有两层,一层是shell本身的mate,这一层可以用echo命令测试输出,经过这一层转义之后的结果会进入grep命令,并在grep中进行第二层的转义,例如当grep利用双引号查找$时要将转义字符作为第二层转义的输入送到grep中,grep实际输入的应该是\$,这样才能查找到文件中的$字符,对于grep来说他的meta我暂时只发现了$和\,$对于grep来说有进行变量转换的内部功能,\在grep内还是转义功能,而"和'并不是grep的meta,因此不需要二层转义,是否需要二层转义应该是根据不同命令的meta决定的。
下面是博主的测试例子:
首先创建一个测试文件
vim test.sh
"$'home'$"\
dqwd\
dfvfwf
测试查找$:
grep '\$' test.sh 实际传入grep的是\$
grep "\\$" test.sh 实际传入grep的是\$
grep \\$ test.sh 实际传入grep的是\$
查找"有效:
grep '"' test.sh 实际传入grep的是"
grep '\"' test.sh 实际传入grep的是\"
grep "\"" test.sh 实际传入grep的是"
查找\有效:
grep "\\\\" test.sh 实际传入grep的是\\
grep '\\' test.sh 实际传入grep的是\\
查找'有效:
grep "'" test.sh
只有这一个是有效的,而grep "\'" test.sh无效,echo "\'" 会输出\'(这个原因暂时未找到),根据我的多层转义理论'对grep来说不是meta,因此传入grep中必须是单独'才有效,而grep ''' test.sh无效是因为单引号内的单引号是无法转义的,因为单引号在优先级上来说是最高且总是就近匹配的,优先级应该是''>\>""这样的。
因此如果想要查找内部含有单引号的字符换必须使用双引号,例如查找'$"\必须使用 grep "'\\$\"\\\\" test.sh