accepted answer很棒 . 我正在制作一个有助于快速理解该主题的表格 . 解释涉及一个简单的变量 a 以及一个索引数组 arr .
如果我们设定
a=apple # a simple variable
arr=(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 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"
---+-------------+-------------+--------------------------------------------------------------------
5 回答
单引号不会插入任何内容,但双引号会 . 例如:变量,反引号,某些
\
转义等 .例:
Bash手册有这样的说法:
accepted answer很棒 . 我正在制作一个有助于快速理解该主题的表格 . 解释涉及一个简单的变量
a
以及一个索引数组arr
.如果我们设定
然后
echo
第二列中的表达式,我们将得到第三列中显示的结果/行为 . 第四列解释了这种行为 .也可以看看:
ANSI-C quoting with $'' - GNU Bash Manual
Locale translation with $"" - GNU Bash Manual
A three-point formula for quotes
其他人解释得非常好,只想给出简单的例子 .
Single quotes 可以在文本周围使用,以防止shell解释任何特殊字符 . 当用单引号括起来时,美元符号,空格,&符号,星号和其他特殊字符都会被忽略 .
它会给出这样的:
唯一不能放在单引号内的是单引号 .
Double quotes 与单引号类似,除了双引号仍然允许shell解释美元符号,后引号和反斜杠 . 众所周知,反斜杠可以防止解释单个特殊字符 . 如果需要将美元符号用作文本而不是变量,则在双引号内这可能很有用 . 它还允许对双引号进行转义,因此它们不会被解释为带引号的字符串的结尾 .
它会给出这样的:
还可以注意到,撇号(否则将被解释为带引号的字符串的开头)在双引号内被忽略 . 但是,变量被解释并用双引号内的值替换 .
它会给出这样的:
Back quotes 完全不同于单引号或双引号 . 后引号实际上强制执行它们所包含的命令,而不是用于防止特殊字符的解释 . 执行所附的命令后,将替换它们的输出以代替原始行中的后引号 . 通过一个例子,这将更加清晰 .
它会给出这样的:
' '
和" "
的用法有明显的区别 .当
' '
用于任何事物时,没有"transformation or translation"完成 . 它是按原样打印的 .随着
" "
,无论它包围什么,它的值都是"translated or transformed" .通过翻译/转换,我的意思是:单引号内的任何内容都不会是"translated"到它们的值 . 它们将被引用,因为它们在引号内 . 示例:
a=23
,然后echo '$a'
将在标准输出上生成$a
. 而echo "$a"
将在标准输出上产生23
.如果您指的是当您回显某些内容时会发生什么,单引号将逐字回显它们之间的内容,而双引号将评估它们之间的变量并输出变量的值 .
例如,这个
会给这个: