Bash中单引号和双引号之间的区别
在Bash中,单引号(''
)和双引号(""
)之间有什么区别?
单引号不会插入任何内容,但双引号会。例如:变量,反引号,某些\
转义等。
例:
$ echo "$(echo "upg")"upg $ echo '$(echo "upg")'$(echo "upg")
Bash手册有这样的说法:
用单引号(
'
)括起字符可以保留引号中每个字符的字面值。单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。在双引号包围字符(
"
)保留了引号中的所有字符的字面意义,例外$
,`
,\
,和,启用了历史扩展的时候,!
。字符$
并`
在双引号内保留其特殊含义(请参阅Shell Expansions)。反斜杠后跟当由下列字符只保留它的特殊含义:$
,`
,"
,\
或换行。在双引号内,将删除后跟其中一个字符的反斜杠。没有特殊含义的字符前面的反斜杠不做修改。双引号可以在双引号内引用,前面加一个反斜杠。如果启用,将执行历史记录扩展,除非!
使用反斜杠转义出现在双引号中。之前的反斜杠!
不会被删除。双引号时的特殊参数
*
和@
特殊含义(参见Shell参数扩展)。
如果您指的是当您回显某些内容时会发生什么,单引号将直接回显它们之间的内容,而双引号将评估它们之间的变量并输出变量的值。
例如,这个
#!/bin/shMYVAR=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 variablearr=(apple) # an indexed array with a single element
然后echo
在第二列中的表达式,我们将得到第三列中显示的结果/行为。第四列解释了这种行为。
# | 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 "" 14 | '`echo hi`' | `echo hi` | `` and $() are not evaluated inside '' 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 ---+-------------+-------------+--------------------------------------------------------------------
也可以看看:
举报