Shell环境下未被引号包裹的反斜杠是如何解析的?
无引号场景下shell反斜杠的解析规则
你观察到的差异本质是shell会在执行命令前的词法解析阶段就处理反斜杠,处理完成后才会把参数传给echo命令,和echo本身的-E参数没有关系。
无引号包裹时,shell对反斜杠的解析规则如下:
- 无引号的反斜杠是shell原生的转义字符,仅作用于紧跟在它之后的第一个字符,作用是取消该字符的所有特殊含义,转义完成后反斜杠本身会被shell直接丢弃
- 唯一例外是反斜杠后紧跟换行符的情况,此时反斜杠+换行符的组合会被整体丢弃,实现命令续行的效果
结合你的场景解释
执行
echo -E \n时:
无引号的\n会先被shell解析,反斜杠转义了后续普通字符n(转义普通字符无额外效果,最终仍保留n),反斜杠本身被丢弃。最终传给echo的参数是-E和n,所以输出结果为n。执行
echo -E "\n"时:
双引号内的反斜杠规则不同,仅当反斜杠后紧跟$、反引号、"、\、换行符这五类字符时才会触发转义逻辑,其余场景下反斜杠会被当作普通字符保留。此处反斜杠后是n,不满足转义触发条件,所以\n作为整体被传给echo,加上-E参数禁止echo本身解析转义序列,最终输出\n。
如果要在无引号场景下得到和双引号相同的输出,可写为echo -E \\n:shell解析时第一个反斜杠转义第二个反斜杠,丢弃第一个、保留第二个,最终传给echo的参数就是\n。
内容的提问来源于stack exchange,提问作者zwithouta
相关产品推荐
相关产品推荐

