单引号和双引号在Bash中的差异?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (3)
  • 关注 (0)
  • 查看 (81)

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

提问于
用户回答回答于

单引号不会插入任何内容,但是双引号会(例如变量,反引号,某些\转义等..)

“Bash manual ”有这样的说法:

3.1.2.2单引号

以单引号括起来的字符(')保留引号中每个字符的文字值。单引号之间可能不会出现单引号,即使在前面加上反斜杠时也是如此。

3.1.2.3双引号

以双引号括起来的字符(")保留引号中所有字符的字面值,除了$`\$`在双引号中保留它们的特殊含义(见shell expension).反斜杠只有在后面跟着下列字符之一时才保留其特殊含义:$`"\或者newline。在双引号中,移除后面跟着其中一个字符的反斜杠。前面没有特殊意义的字符前面的反斜杠保持不变。双引号可以在双引号中引用,方法是在双引号前面加上反斜杠。如果启用,将执行历史扩展,除非!出现在双引号中的是使用反斜杠转义的。前面的反斜杠!不会被移除。 特殊参数*@在双引号中有特殊意义(见shell Parameter Expension)。

用户回答回答于

我对accpeted answer很满意,它涉及了一个简单的变量a以及索引数组arr

假设

a=apple      # a simple variable
arr=(apple)  # an 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 ""
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
---+-------------+-------------+--------------------------------------------------------------------

另见:

用户回答回答于

如果你指的是当回显某一内容时发生的事情,那么单引号将真实地反映出它们之间的内容,而双引号则会计算它们之间的变量并输出变量的值。

例如,这个

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

扫码关注云+社区

领取腾讯云代金券