在Bash中,单引号('')和双引号(“”)之间有什么区别?


当前回答

其他人解释得很好,我只想举一些简单的例子。

可以在文本周围使用单引号,以防止外壳解释任何特殊字符。美元符号、空格、与符号、星号和其他特殊字符都会在单引号中被忽略。

echo 'All sorts of things are ignored in single quotes, like $ & * ; |.'

它将提供:

All sorts of things are ignored in single quotes, like $ & * ; |.

唯一不能放在单引号内的是单引号。

双引号的作用类似于单引号,但双引号仍然允许shell解释美元符号、反引号和反斜杠。众所周知,反斜杠阻止解释单个特殊字符。如果需要将美元符号用作文本而不是变量,这在双引号中非常有用。它还允许转义双引号,以便它们不会被解释为带引号字符串的结尾。

echo "Here's how we can use single ' and double \" quotes within double quotes"

它将提供:

Here's how we can use single ' and double " quotes within double quotes

还可能注意到,撇号在双引号中被忽略,否则撇号将被解释为引号字符串的开头。然而,变量被解释并用双引号内的值替换。

echo "The current Oracle SID is $ORACLE_SID"

它将提供:

The current Oracle SID is test

反引号与单引号或双引号完全不同。反引号实际上不是用来阻止特殊字符的解释,而是强制执行它们所包含的命令。在执行封闭的命令后,它们的输出将替换为原始行中的反引号。举个例子会更清楚。

today=`date '+%A, %B %d, %Y'`
echo $today

它将提供:

Monday, September 28, 2015

其他回答

其他人解释得很好,我只想举一些简单的例子。

可以在文本周围使用单引号,以防止外壳解释任何特殊字符。美元符号、空格、与符号、星号和其他特殊字符都会在单引号中被忽略。

echo 'All sorts of things are ignored in single quotes, like $ & * ; |.'

它将提供:

All sorts of things are ignored in single quotes, like $ & * ; |.

唯一不能放在单引号内的是单引号。

双引号的作用类似于单引号,但双引号仍然允许shell解释美元符号、反引号和反斜杠。众所周知,反斜杠阻止解释单个特殊字符。如果需要将美元符号用作文本而不是变量,这在双引号中非常有用。它还允许转义双引号,以便它们不会被解释为带引号字符串的结尾。

echo "Here's how we can use single ' and double \" quotes within double quotes"

它将提供:

Here's how we can use single ' and double " quotes within double quotes

还可能注意到,撇号在双引号中被忽略,否则撇号将被解释为引号字符串的开头。然而,变量被解释并用双引号内的值替换。

echo "The current Oracle SID is $ORACLE_SID"

它将提供:

The current Oracle SID is test

反引号与单引号或双引号完全不同。反引号实际上不是用来阻止特殊字符的解释,而是强制执行它们所包含的命令。在执行封闭的命令后,它们的输出将替换为原始行中的反引号。举个例子会更清楚。

today=`date '+%A, %B %d, %Y'`
echo $today

它将提供:

Monday, September 28, 2015

单引号不会插入任何内容,但双引号会插入。例如:变量、倒勾、某些\转义等。

例子:

$ echo "$(echo "upg")"
upg
$ echo '$(echo "upg")'
$(echo "upg")

Bash手册有这样的说法:

3.1.2.2单项报价将字符括在单引号(')中会保留引号中每个字符的文字值。单引号不能出现在单引号之间,即使前面有反斜杠。3.1.2.3双引号将字符括在双引号(“)中会保留引号中所有字符的文字值,但启用历史扩展时,$、`、\和!除外。字符$和`在双引号中保留其特殊含义(请参阅Shell扩展)。反斜杠仅在后跟以下字符之一时保留其特殊意义:$、`,“、\或换行符。在双引号内,将删除后跟其中一个字符的反斜杠。没有特殊含义的字符前面的反斜杠将保持不变。双引号可以在双引号内加反斜杠。如果启用,将执行历史扩展,除非!出现在双引号中的字符使用反斜杠转义。前面的反斜杠!未删除。特殊参数*和@在双引号中时具有特殊含义(请参见Shell参数扩展)。

“”和“”的用法有明显区别。

当“”用于任何事物时,不会进行“转换或翻译”。它按原样打印。

“”,无论它围绕着什么,都被“翻译或转化”为它的价值。

通过翻译/转换,我的意思是:单引号内的任何内容都不会“转换”为其值。它们将被视为引号内的内容。示例:a=23,则echo“$a”将在标准输出上生成$a。而echo“$a”将在标准输出上产生23。

如果你指的是当你回显某个东西时发生的事情,那么单引号将直接回显它们之间的内容,而双引号将计算它们之间的变量并输出变量的值。

例如,这个

#!/bin/sh
MYVAR=sometext
echo "double quotes gives you $MYVAR"
echo 'single quotes gives you $MYVAR'

将给出以下内容:

double quotes gives you sometext
single quotes gives you $MYVAR

人们需要一个最低限度的答案,不用像我那样花很多时间就可以开始工作。

令人惊讶的是(对于那些寻找答案的人来说),以下是一个完整的命令:

$ echo '\'

其输出为:

\

即使是bash的长期用户也感到惊讶的是,反斜杠在单引号中没有任何含义。其他也没有。