在 Linux shell 环境中,某些特殊字符具有特定功能,使用时需要进行转义(通常在字符前加反斜杠 \
或使用引号包裹)。以下是需要转义的主要字符及其场景:
这些字符在 shell 中有特殊含义,直接使用会导致意外行为:
& ; | * ? ~ < > ^ ( ) [ ] $ ` \ " ' { } ! % # 空格 换行符
示例:
# 转义特殊字符
echo "Cost: \$5" # $ 需转义,否则会被视为变量
ls file\ with\ spaces # 空格需转义
grep "\[error\]" file # [] 需转义
# 单引号 vs 双引号
echo 'Price is $5!' # 单引号内所有字符均原样输出
echo "Price is \$5!" # 双引号内仍需转义 $、`、\、! 等
\
:直接转义单个字符。
bash
touch file\ name.txt # 转义空格
' '
:包裹的字符串完全原样输出(包括大多数特殊字符)。
bash
echo 'This is $var & "text"' # 输出内容完全不变
" "
:允许变量扩展(如 $var
),但需转义 $
、`
、\
、!
(在历史扩展启用时)等。
bash
echo "User: \$USER" # 转义 $ 避免变量扩展
. * ^ $ [] \ + ? | { } ()
bash
grep "file\.txt" log # 转义 . 避免匹配任意字符
sed 's/price/\$5/g' # 转义 $
cd /path/with\ spaces # 转义空格
rm "file*" # 引号防止通配符扩展
touch "file@#.txt" # 引号包裹特殊字符
rm -- -filename # 以 -- 处理以 - 开头的文件名
curl
或 jq
中需处理 %
、&
、=
等:
bash
curl "http://example.com?q=test\&page=1" # 转义 &
$
、\
)。
bash
echo 'This is $var & \text' # 输出原样字符串
*
、@
等(除非在特定上下文如正则中)。bash
var="value & text" # 直接赋值
`command`
或 $(command)
中的特殊字符需注意。bash
cat <<'EOF'
This is $var & text
EOF
场景 | 需转义字符 | 转义方法 |
---|---|---|
Shell 命令行 | $ & ; | * ? < > ( ) [ ] { } 等 |
\ 或引号包裹 |
正则表达式 | . * ^ $ \ [ ] + ? 等 |
\ 或使用 -E 选项 |
文件名/路径 | 空格、* 、? 、[ 、] |
\ 或引号包裹 |
通过合理使用转义和引号,可以避免大多数 shell 解析问题。