Bash单引号与双引号的区别


如果您使用过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中引用字符串时,务必根据要实现的目标选择合适的引号类型。如果您不确定使用哪种类型的引号,通常使用双引号是安全的,因为它们允许最大的灵活性。

更新于:2023年4月12日

浏览量:1000+

开启您的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.