我需要保留定义的字符串变量周围的双引号,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
基本上,将字符括在单引号或双引号内会将它们转换为文字字符,没有特殊含义(双引号有一些例外,但它们在这里并不重要)。因此,在字符序列中'"hey"'
,单引号“保护”所有其他字符,双引号失去其特殊含义并保留为文字字符。