Bash中单引号和双引号的区别

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

单引号不会内插任何东西,但双引号将(例如variables,反引号,某些\转义等…)

Bash手册有这样的说法:

3.1.2.2单引号

用单引号括起来的字符( ' )保留引号内每个字符的字面值。 单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。

3.1.2.3双引号

用双引号( " )括起来的字符保留了引号内的所有字符的字面值,除了$`\ ,并且当启用历史扩展时, ! 。字符$`保留它们在双精度内的特殊含义引号(见Shell Expansions )。只有当后面跟着以下字符之一时,反斜线才会保留其特殊含义: $`"\或newline。 在双引号内,删除后面跟着其中一个字符的反斜杠。 没有特殊含义的字符之前的反斜杠保持不变。 双引号可以用双引号引起来,前面加一个反斜杠。 如果启用,历史扩展将被执行,除非! 出现在双引号中使用反斜线进行转义。 !前面的反斜杠! 不会被删除。

使用双引号时,特殊参数*@具有特殊含义(请参见壳参数扩展 )。

如果你指的是当你回应某些事情时会发生什么,那么单引号就会回应你之间的内容,而双引号将会评估它们之间的variables并输出variables的值。

例如,这个

 #!/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 

接受的答案是伟大的。 我正在制作一个表格,帮助你快速理解这个话题。 解释涉及一个简单的variablesa以及一个索引数组arr

如果我们设置

 a=apple # a simple variable arr=(apple) # an array with a single element 

然后在第二列中echo显expression式,我们将得到第三列中显示的结果/行为。 第四列解释行为。

  # | 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 "" 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 ---+-------------+-------------+-------------------------------------------------------------------- 

也可以看看:

  • ANSI-C引用
  • 三点式报价