shell中单引号是最严格的,完全禁用转义,这符合它“原样输出”的设计目标。双引号允许转义特定字符如$和",但奇怪的是\n这种传统转义在shell双引号里不生效——这点必须强调,因为很多人会踩坑。不加引号时反斜杠倒是能转义空格,但其他字符又不行,这种分裂行为确实容易让人困惑。
一、Shell(Bash/Zsh 等)
单引号 ' '
✅ 完全不支持转义,反斜杠是普通字符:
bash
echo '$PATH \n' # 输出: $PATH \n
双引号 " "
✅ 部分支持转义:
可转义 $, `, ", \ 等元字符
\n, \t 等不生效(需配合 echo -e 或 printf):
bash
echo "$PATH \n" # 输出: $PATH \n
echo -e "Line1\nLine2" # 需 -e 才识别 \n
无引号
❌ 反斜杠仅用于转义空格/特殊符号:
bash
echo hello\nworld # 输出: hellonworld(\n 未被转义)
echo hello\ world # 转义空格:输出 "hello world"
二、Perl
单引号 ' '
✅ 支持 \ 和 ',其他转义无效:
perl
print '\ ' \n'; # 输出: \ ' \n
双引号 " "
✅ 完整支持转义序列(\n, \t, \x27 等)和变量插值:
perl
print "Hello\nPATH: $ENV{'PATH'}";
其他引号变体
q() 等效单引号:q(\n) → \n
qq() 等效双引号:qq(\n) → 换行
三、其他编程语言对比
语言 单引号 双引号 无引号/原生字符串
Python 无转义('\n' 是 \ + n) 支持转义("\n" 换行) 不存在无引号,但可用 r"\n" 取消转义
JavaScript 同双引号(支持 '\n') 支持转义("\n") 无字符串无引号语法
Java 无单引号字符串(char用'') 支持转义("\n") 无
Go 同双引号(支持'\n') 支持转义("\n") 反引号
取消转义
Ruby 无转义('\n' 为字面值) 支持转义("\n") %q[] 等效单引号,%Q[] 等效
关键结论
Shell 最特殊:
单引号:完全禁用转义
双引号:仅支持元字符转义($等),\n需外部命令解析
无引号:反斜杠仅用于保护空格/特殊符号
Perl/Python/Ruby 等高级语言:
单引号:大多禁用转义(Perl 例外:支持 \ 和 ')
双引号:完整支持转义序列
普遍提供 raw string 机制(如Perl的 q(), Python的 r"")避免转义