Shell 中变量与引号的用法:单引号与双引号的核心区别
在 Shell 脚本中,单引号('
)和双引号("
)是处理字符串和变量时的重要符号,二者的核心区别在于是否对内容进行解析。理解它们的差异是编写正确 Shell 脚本的基础。
双引号("
):支持解析与替换
双引号会保留字符串的原始格式,同时对其中的变量、命令和转义字符进行解析(替换为实际值),是日常使用中最频繁的引号类型。
解析变量(变量替换)
双引号中的变量(以 $
开头)会被替换为变量的值:
1 | name="Shell" |
解析命令执行结果(命令替换)
双引号中通过 command
或 $(command)
嵌入的命令,会被替换为命令的执行结果:
1 | echo "当前目录: $(pwd)" # 输出:当前目录: /home/user |
解析转义字符
双引号中支持部分转义字符(如 \n
换行、\t
制表符、\$
保留 $
符号等):
1 | echo "第一行\n第二行" # 输出:第一行 第二行(注意:需结合 -e 选项才会解析\n为换行) |
保留空格和换行
双引号会保留字符串中的空格和换行符,避免被 Shell 拆分为多个参数:
1 | message="Hello World" # 字符串包含多个空格 |
单引号('
):完全原样输出
单引号会将包裹的内容完全视为纯字符串,不解析任何变量、命令或转义字符,适用于需要原样输出特殊字符的场景。
不解析变量
单引号中的变量不会被替换,$
会被视为普通字符:
1 | name="Shell" |
不解析命令
单引号中的命令不会被执行,原样输出命令表达式:
1 | echo '当前目录: $(pwd)' # 输出:当前目录: $(pwd)(命令未执行) |
不解析转义字符
单引号中的转义字符(如 \n
、\$
)会被视为普通字符:
1 | echo '第一行\n第二行' # 输出:第一行\n第二行(\n 未被解析) |
保留所有特殊字符
单引号可用于包裹包含空格、引号、通配符(*
、?
)等特殊字符的字符串:
1 | echo '文件名为:"test.txt"' # 输出:文件名为:"test.txt"(双引号被保留) |
无引号:默认拆分与解析
当字符串不使用引号时,Shell 会按以下规则处理:
- 拆分单词:以空格、制表符、换行符为分隔符,将字符串拆分为多个参数;
- 解析变量和命令:与双引号类似,会替换变量和命令;
- 通配符扩展:会解析
*
、?
等通配符(如*.txt
会匹配所有 txt 文件)。
1 | file="*.txt" |
v1.3.10