Bash 单引号与双引号的区别

linuxbashopen source更新于 2026/2/4 6:22:17

如果您使用过 Bash,您可能已经注意到,在定义变量或向命令传递参数时可以使用两种类型的引号:单引号 (' ') 和双引号 (" ")。

乍一看,这些引号似乎可以互换,但实际上它们之间存在一些关键差异,这些差异可能会影响 Bash 命令的行为。在本文中,我们将探讨这些差异,并解释何时应使用单引号、何时应使用双引号,以及混合使用它们时会发生什么。

定义单引号和双引号

在深入探讨单引号和双引号之间的差异之前,让我们先来定义一下它们的含义以及它们的工作原理。

单引号 − 将文本字符串括在单引号中会导致 Bash 将引号内的所有内容解释为文字字符串,引号内的任何字符均不具有特殊含义。

示例

echo 'Hello World!'

输出

Hello World!

在上面的例子中,单引号确保字符串末尾的感叹号被解释为文字字符,而不是在 Bash 中可能具有其他含义的特殊字符。

双引号 − 将文本字符串括在双引号中会导致 Bash 以特殊方式解释引号内的某些字符。例如,Bash 会将引号内的任何变量替换为其值,并解释某些转义序列,例如
(换行符)、\t(制表符)和 \e(转义符)。

示例

name='John'
echo "Hello $name!"

输出

Hello John!

在上面的例子中,Bash 将 $name 变量的值(即"John")替换为双引号括起来的字符串。

单引号与双引号:区别

现在我们了解了单引号和双引号的工作原理,让我们来探讨一下它们之间的区别。

变量替换

正如我们在前面的例子中看到的,Bash 会替换双引号括起来的变量的值,但不会替换单引号括起来的变量的值。这意味着,如果要在字符串中包含变量的值,应该将字符串括在双引号中。

示例

name='John'
echo "Hello $name!"

echo 'Hello $name!'

输出

Hello John!
Hello $name!

在上面的第二个例子中,变量 $name 未被替换,因为它被单引号括起来了。

命令替换

您也可以使用引号括起命令,这样您就可以将命令的输出替换为字符串。但是,单引号和双引号处理命令替换的方式有所不同。

当您将命令括在双引号中时,Bash 将执行命令并将其输出替换为字符串。当您将命令括在单引号中时,Bash 会将命令视为文字字符串,并且不会执行命令或替换其输出。

例如 −

$ echo "The current directory is: $(pwd)"
The current directory is: /home/user

$ echo 'The current directory is: $(pwd)'
The current directory is: $(pwd)

在上面的第一个例子中,命令 pwd 被执行,其输出被替换为用双引号括起来的字符串。在第二个例子中,命令 pwd 被视为文字字符串,因为它被用单引号括起来。

特殊字符

如前所述,Bash 会解释双引号内的某些转义序列,例如
和 \t,但不会解释单引号内的转义序列。这意味着,如果要在字符串中包含特殊字符,应该将字符串括在双引号中。

例如 −

$ echo "This is a string
with a newline character" This is a string with a newline character

在上面的例子中,
转义序列被解释为换行符,因为它被用双引号括起来。如果我们用单引号将字符串括起来,Bash 会将
解释为反斜杠后跟字母 n。

引用字符

最后,值得注意的是,您可以使用引号来包含那些原本会被 Bash 解释为特殊字符的字符。例如,如果您想在字符串中包含 $ 或 \ 字符,则可以将字符串括在单引号中。

示例

echo '$5.00'

echo '\home\user'

输出

$5.00
\home\user

在上面的第一个例子中,$ 字符被视为字面字符,因为字符串用单引号括起来。在第二个例子中,反斜杠也被视为字面字符,因为字符串用单引号括起来。

混合使用单引号和双引号

有时,您可能需要在字符串中同时包含单引号和双引号。在这种情况下,您可以使用引号组合来实现所需的结果。

示例

echo "He said, 'Hello World!'"

echo 'The cost is $"5.00"'

输出

He said, 'Hello World!'
The cost is $"5.00"

在上面的第一个例子中,我们使用双引号括起整个字符串,但使用单引号括起嵌套字符串"Hello World!"。在第二个例子中,我们使用单引号括起整个字符串,但使用双引号括起嵌套字符串 $"5.00"。

除了我们已经讨论过的区别之外,在 Bash 中使用单引号和双引号时还有一些其他细微差别需要考虑。

首先,值得注意的是,引号可以相互嵌套。例如,您可以将字符串括在双引号中,然后将嵌套字符串括在单引号中。

示例

echo "He said, 'My name is John.'"

输出

He said, 'My name is John.'

在此示例中,我们使用双引号括起整个字符串,但使用单引号括起嵌套字符串"My name is John."

其次,务必了解 Bash 如何处理引号内的空白字符(例如空格和制表符)。当您将字符串括在双引号中时,Bash 会保留引号内的所有空白字符。当您将字符串括在单引号中时,Bash 会将所有空白字符视为文字字符。

示例

name='John Smith'
echo "Hello, $name"

echo 'Hello,    $name'

输出

Hello, John Smith
Hello,    $name

在上面的第一个例子中,Bash 保留了"John"和"Smith"之间的空格字符,因为字符串是用双引号括起来的。在第二个例子中,Bash 将制表符视为文字字符,因为字符串是用单引号括起来的。

最后,值得一提的是,在 Bash 中引号并非总是必要的。例如,如果您定义的变量包含不带特殊字符的字符串,则可以完全省略引号。

示例

message=Hello
echo $message

输出

Hello

在此示例中,我们定义变量"message"来包含字符串"Hello",而无需将其括在引号中。当我们稍后回显变量时,Bash 会毫无问题地打印出字符串"Hello"。

结论

总而言之,Bash 中单引号和双引号的主要区别在于,双引号允许变量替换、命令替换以及某些转义序列的解释,而单引号将其中的所有内容视为文字字符串。在 Bash 中使用引号引用字符串时,根据目标选择合适的引号类型非常重要。如果您不确定要使用哪种类型的引号,通常使用双引号是安全的,因为它们可以提供最大的灵活性。


相关文章


有用资源