当用单引号括起来时,为什么字符串变量中会保留引号?

当用单引号括起来时,为什么字符串变量中会保留引号?

我需要保留定义的字符串变量周围的双引号,bash以便能够将其传递给Scheme编程语言的方言。我的问题是为什么双引号放在另一组单引号内时会保留?为了说明这一点,我举了一些我的例子bash command prompt

$ str1=hey
$ echo $str1
hey
$ str2="hey"
$ echo $str2
hey
$ str3='hey'
$ echo $str3
hey
$ str4='"hey"'
$ echo $str4
"hey"
$ str5="'hey'"
$ echo $str5
'hey'
$ 

答案1

单引号字符串将保留该字符串作为文字。双引号字符串将保留带有变量插值和扩展的字符串。 bash 手册页对此进行了解释 - 请参阅标题为 QUOTING 的部分

共有三种引用机制:转义字符、单引号和双引号。

不带引号的反斜杠 (\) 是转义字符。它保留后面的下一个字符的字面值,但 {newline} 除外。如果出现 \{newline} 对,并且反斜杠本身没有被引号引起来,则 \{newline} 将被视为行延续(即,它会从输入流中删除并被有效忽略)。

将字符括在单引号中可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠也是如此。

将字符括在双引号中会保留引号内所有字符的字面值,但 $、`、\ 以及启用历史扩展时的 ! 除外。字符 $ 和 ` 在双引号内保留其特殊含义。 仅当后跟以下字符之一时,反斜杠才保留其特殊含义:$、`、"、\ 或 {newline}。可以通过在双引号内添加反斜杠来引用双引号。如果启用,历史扩展除非使用反斜杠对出现在双引号中的 ! 进行转义,否则将执行该操作。

答案2

Bash 参考手册中有关引用的部分

基本上,将字符括在单引号或双引号内会将它们转换为文字字符,没有特殊含义(双引号有一些例外,但它们在这里并不重要)。因此,在字符序列中'"hey"',单引号“保护”所有其他字符,双引号失去其特殊含义并保留为文字字符。

相关内容