shell中 单引号、双引号、无引号、反斜杠在grep命令中的二次转义

时间:2021-11-16 21:45:03

对于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