在Bash中,单引号('')和双引号(“”)之间有什么区别?
当前回答
人们需要一个最低限度的答案,不用像我那样花很多时间就可以开始工作。
令人惊讶的是(对于那些寻找答案的人来说),以下是一个完整的命令:
$ echo '\'
其输出为:
\
即使是bash的长期用户也感到惊讶的是,反斜杠在单引号中没有任何含义。其他也没有。
其他回答
人们需要一个最低限度的答案,不用像我那样花很多时间就可以开始工作。
令人惊讶的是(对于那些寻找答案的人来说),以下是一个完整的命令:
$ echo '\'
其输出为:
\
即使是bash的长期用户也感到惊讶的是,反斜杠在单引号中没有任何含义。其他也没有。
如果你指的是当你回显某个东西时发生的事情,那么单引号将直接回显它们之间的内容,而双引号将计算它们之间的变量并输出变量的值。
例如,这个
#!/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
公认的答案很好。我正在制作一张有助于快速理解主题的表格。解释涉及一个简单变量a以及一个索引数组arr。
如果我们设置
a=apple # a simple variable
arr=(apple) # an indexed array with a single element
然后在第二列中回显表达式,我们将得到第三列中显示的结果/行为。第四列解释了行为。
# | Expression | Result | Comments |
---|---|---|---|
1 | "$a" |
apple |
variables are expanded inside "" |
2 | '$a' |
$a |
variables are not expanded inside '' |
3 | "'$a'" |
'apple' |
'' has no special meaning inside "" |
4 | '"$a"' |
"$a" |
"" is treated literally inside '' |
5 | '\'' |
invalid | can not escape a ' within '' ; use "'" or $'\'' (ANSI-C quoting) |
6 | "red$arocks" |
red |
$arocks does not expand $a ; use ${a}rocks to preserve $a |
7 | "redapple$" |
redapple$ |
$ followed by no variable name evaluates to $ |
8 | '\"' |
\" |
\ has no special meaning inside '' |
9 | "\'" |
\' |
\' is interpreted inside "" but has no significance for ' |
10 | "\"" |
" |
\" is interpreted inside "" |
11 | "*" |
* |
glob does not work inside "" or '' |
12 | "\t\n" |
\t\n |
\t and \n have no special meaning inside "" or '' ; use ANSI-C quoting |
13 | "`echo hi`" |
hi |
`` and $() are evaluated inside "" (backquotes are retained in actual output) |
14 | '`echo hi`' |
`echo hi` |
`` and $() are not evaluated inside '' (backquotes are retained in actual output) |
15 | '${arr[0]}' |
${arr[0]} |
array access not possible inside '' |
16 | "${arr[0]}" |
apple |
array access works inside "" |
17 | $'$a\'' |
$a' |
single quotes can be escaped inside ANSI-C quoting |
18 | "$'\t'" |
$'\t' |
ANSI-C quoting is not interpreted inside "" |
19 | '!cmd' |
!cmd |
history expansion character '!' is ignored inside '' |
20 | "!cmd" |
cmd args |
expands to the most recent command matching "cmd" |
21 | $'!cmd' |
!cmd |
history expansion character '!' is ignored inside ANSI-C quotes |
另请参见:
ANSI-C引用$''-GNU Bash手册带有$“”的本地化翻译-GNU Bash手册报价的三点公式
“”和“”的用法有明显区别。
当“”用于任何事物时,不会进行“转换或翻译”。它按原样打印。
“”,无论它围绕着什么,都被“翻译或转化”为它的价值。
通过翻译/转换,我的意思是:单引号内的任何内容都不会“转换”为其值。它们将被视为引号内的内容。示例:a=23,则echo“$a”将在标准输出上生成$a。而echo“$a”将在标准输出上产生23。
单引号不会插入任何内容,但双引号会插入。例如:变量、倒勾、某些\转义等。
例子:
$ echo "$(echo "upg")"
upg
$ echo '$(echo "upg")'
$(echo "upg")
Bash手册有这样的说法:
3.1.2.2单项报价将字符括在单引号(')中会保留引号中每个字符的文字值。单引号不能出现在单引号之间,即使前面有反斜杠。3.1.2.3双引号将字符括在双引号(“)中会保留引号中所有字符的文字值,但启用历史扩展时,$、`、\和!除外。字符$和`在双引号中保留其特殊含义(请参阅Shell扩展)。反斜杠仅在后跟以下字符之一时保留其特殊意义:$、`,“、\或换行符。在双引号内,将删除后跟其中一个字符的反斜杠。没有特殊含义的字符前面的反斜杠将保持不变。双引号可以在双引号内加反斜杠。如果启用,将执行历史扩展,除非!出现在双引号中的字符使用反斜杠转义。前面的反斜杠!未删除。特殊参数*和@在双引号中时具有特殊含义(请参见Shell参数扩展)。