Shell中Quoting(引用),可以用来移除字符的特殊意思,令其保留字面含义;可以用来进行多种Shell Expansion。


有3种quoting机制:转义字符,单引号,和双引号。



1. 转义字符

非引用的反斜杠‘\’称为转义字符,它保留了后面单个字符的字面含义(移除了特殊意义)。有个例外,反斜杠作为输入行的最后一个字符,Shell将其视为续行符,删除随后的换行符,不会将该换行符作为参数的分隔符,就像这个字符没出现过。


2. 单引号

在单引号‘'’中的所有字符,都会保留它们的字面含义。注意,一个单引号不能出现在两个单引号中间,即使其前面有反斜杠也不行。


3. 双引号

双引号中除了4个字符’$‘,‘`’,‘\’和‘!’外,其它都保持字面含义(注,Shell在POSIX模式下,‘!’也保持字面含义)。 


字符‘$’和‘`’会进行Shell Expansion(如变量扩展,命令替换等)。


反斜杠‘\’在‘$’,‘`’,‘"’,‘\’,和newline前面时,其会被移除掉,后面的字符不变,表示字面含义。


在可History expansion时,’!‘前面需添加‘\’,才能抑制该扩展,且’\‘不会被移除。



另,了解下特殊的ANSI-C Quoting,形式为$'string',string中的反斜杠‘\’和其后的字符会按照ANSI C的标准转义,结果就像‘$’符号不存在,只使用了单引号。如何使用ANSI-C Quoting,详见Bash编程中变量有无双引号探秘