0%

变量和引号

Shell 中变量与引号的用法:单引号与双引号的核心区别

在 Shell 脚本中,单引号(')和双引号(")是处理字符串和变量时的重要符号,二者的核心区别在于是否对内容进行解析。理解它们的差异是编写正确 Shell 脚本的基础。

双引号("):支持解析与替换

双引号会保留字符串的原始格式,同时对其中的变量命令转义字符进行解析(替换为实际值),是日常使用中最频繁的引号类型。

解析变量(变量替换)

双引号中的变量(以 $ 开头)会被替换为变量的值:

1
2
3
name="Shell"
echo "Hello, $name" # 输出:Hello, Shell
echo "Version: v$1" # 若脚本接收参数1为"1.0",输出:Version: v1.0

解析命令执行结果(命令替换)

双引号中通过 command$(command) 嵌入的命令,会被替换为命令的执行结果:

1
2
echo "当前目录: $(pwd)"  # 输出:当前目录: /home/user
echo "今天是: `date +%F`" # 输出:今天是: 2025-08-06

解析转义字符

双引号中支持部分转义字符(如 \n 换行、\t 制表符、\$ 保留 $ 符号等):

1
2
3
echo "第一行\n第二行"  # 输出:第一行 第二行(注意:需结合 -e 选项才会解析\n为换行)
echo -e "姓名\t年龄" # 输出:姓名 年龄(\t 被解析为制表符)
echo "价格:\$99" # 输出:价格:$99(\$ 被解析为普通$符号)

保留空格和换行

双引号会保留字符串中的空格和换行符,避免被 Shell 拆分为多个参数:

1
2
3
message="Hello   World"  # 字符串包含多个空格
echo $message # 输出:Hello World(空格被合并)
echo "$message" # 输出:Hello World(空格保留)

单引号('):完全原样输出

单引号会将包裹的内容完全视为纯字符串,不解析任何变量、命令或转义字符,适用于需要原样输出特殊字符的场景。

不解析变量

单引号中的变量不会被替换,$ 会被视为普通字符:

1
2
name="Shell"
echo 'Hello, $name' # 输出:Hello, $name($name 未被解析)

不解析命令

单引号中的命令不会被执行,原样输出命令表达式:

1
2
echo '当前目录: $(pwd)'  # 输出:当前目录: $(pwd)(命令未执行)
echo '今天是: `date`' # 输出:今天是: `date`(命令未执行)

不解析转义字符

单引号中的转义字符(如 \n\$)会被视为普通字符:

1
2
echo '第一行\n第二行'  # 输出:第一行\n第二行(\n 未被解析)
echo '$name \t \$' # 输出:$name \t \$(所有符号原样保留)

保留所有特殊字符

单引号可用于包裹包含空格、引号、通配符(*?)等特殊字符的字符串:

1
2
echo '文件名为:"test.txt"'  # 输出:文件名为:"test.txt"(双引号被保留)
echo '删除 *.log 文件' # 输出:删除 *.log 文件(* 被视为普通字符)

无引号:默认拆分与解析

当字符串不使用引号时,Shell 会按以下规则处理:

  1. 拆分单词:以空格、制表符、换行符为分隔符,将字符串拆分为多个参数;
  2. 解析变量和命令:与双引号类似,会替换变量和命令;
  3. 通配符扩展:会解析 *? 等通配符(如 *.txt 会匹配所有 txt 文件)。
1
2
3
4
file="*.txt"
echo $file # 输出当前目录下所有txt文件名(通配符被解析)
echo "$file" # 输出:*.txt(通配符被保留)
echo '$file' # 输出:$file(完全原样)

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10