要输出特殊符号字面量,应优先用单引号包裹(完全不解析),其次用反斜杠逐个转义(仅作用于下一字符),双引号则保留变量/命令替换;换行需用$'...'或printf。

要让 Shell 输出特殊符号的字面量(比如 $、!、“、‘、
等不被解析),关键不是“怎么转义”,而是“用什么方式阻止 Shell 解析”——因为 Shell 的解析发生在命令执行前,一旦被误解析,就无法还原。
单引号:最简单可靠的字面量包裹
单引号内的所有内容都被视为纯文本,包括 $、!、`、、"、*、? 等,一个都不展开。
-
echo '$HOME'→ 输出$HOME(不是路径) -
echo 'It's OK'→ 报错(单引号不能嵌套,也不能用反斜杠转义自身) - 正确写法:
echo 'It'"'"'s OK'或echo "It's OK"(用双引号包住带撇号的字符串)
反斜杠:逐个屏蔽单个字符的特殊含义
反斜杠只对紧邻它的下一个字符生效,且仅在非单引号环境中有效。它不创建新规则,只是“取消当前字符的元角色”。
-
echo $HOME→ 输出$HOME($阻止变量展开,HOME不受影响) -
echo hello world→ 输出hello world(空格被转义,不作分词) -
echo \\$→ 输出$(第一个转义第二个,第三个转义$)
双引号:保留部分解析能力,适合混合场景
双引号允许变量展开、命令替换和算术扩展,但会忽略大多数其他元字符(如 |、&、;、*)。需要输出字面量 $、`、 时才需转义。
-
echo "$USER is here"→ 正常展开变量 -
echo "$USER is here"→ 输出$USER is here -
echo "Today is $(date +%F)"→ 命令替换生效,但%在date内部仍需按其规则处理
处理含换行符的字面量字符串
注意区分两种
:
- Shell 中写
"line1 line2"—— 这里的是两个字符和n,不会变成真实换行 - 想输出真实换行,得用
$'...'语法:echo $'line1 line2'→ 两行输出 - 或用
printf:printf "line1 line2 "(printf自身支持解析)

















