shell 脚本中的单引号和双引号
在 Shell(Bash、Zsh 等)脚本里,**单引号**和**双引号**都能把一串字符变成“一个整体”,但它们在“是否允许变量展开、转义、命令替换”上有本质区别。记住一句话:
> **单引号:所见即所得,原样保留;
> 双引号:先展开再保留。**
下面分场景对比,并给出常见坑点。
------------------------------------------------
1. 变量展开($var)
------------------------------------------------
- 双引号:里面的 `$var` 会被替换成变量值。
- 单引号:里面的 `$var` 仍是普通字符 `$`、`v`、`a`、`r`。
```bash
name=Tom
echo "Hello, $name" # 输出: Hello, Tom
echo 'Hello, $name' # 输出: Hello, $name
```
------------------------------------------------
2. 命令替换($(cmd) 或 \`cmd\`)
------------------------------------------------
- 双引号:命令先执行,结果再拼接。
- 单引号:命令原样输出。
```bash
echo "Today is $(date +%F)" # 输出: Today is 2025-07-17
echo 'Today is $(date +%F)' # 输出: Today is $(date +%F)
```
------------------------------------------------
3. 转义字符(\)
------------------------------------------------
- 双引号:反斜杠可以转义 `"`, `$`, `\`, `` ` `` 等。
- 单引号:反斜杠失去转义意义,就是普通字符。
```bash
echo "a\"b\$c\\d" # 输出: a"b$c\d
echo 'a\"b\$c\\d' # 输出: a\"b\$c\\d
```
------------------------------------------------
4. 拼接/嵌套技巧
------------------------------------------------
- 如果既想保留单引号又想展开变量,可“拆串”或用 `'\''` 技巧:
```bash
var=world
echo 'Hello, '"$var"' !' # 输出: Hello, world !
# 或
echo 'It'\''s a test' # 输出: It's a test
```
------------------------------------------------
5. 数组与空格
------------------------------------------------
- 双引号保护空格,单引号也保护,但变量不会展开:
```bash
files=(a b c)
printf '%s\n' "${files[@]}" # 正确:三行 a b c
printf '%s\n' '${files[@]}' # 错误:字面量 '${files[@]}'
```
------------------------------------------------
6. 最佳实践速记
------------------------------------------------
| 场景 | 用双引号 | 用单引号 |
|--------------------------|----------|----------|
| 变量/命令需要展开 | ✅ | ❌ |
| 正则、JSON、SQL 常量串 | ❌ | ✅ |
| echo 调试脚本 | 视需求 | 视需求 |
| 保证内容一字不改 | ❌ | ✅ |
示例:写一条带变量和单引号的 SQL
```bash
table="users"
sql='SELECT * FROM "'"$table"'" WHERE id = 123;'
# 最终得到:SELECT * FROM "users" WHERE id = 123;
```
------------------------------------------------
一句话总结
------------------------------------------------
> **“要展开用双引,不展开用单引;不确定就先用双引,再按需转义。”**

浙公网安备 33010602011771号