在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参数扩展)。