bash 中单引号 $'string' 和双引号 $"string" 有什么区别?

Raf*_*sin 11 bash echo quoting

我试图使用执行新行echo并尝试执行以下两个命令:

  1. 第一条命令:

    echo $'Hello World\nThis is a new line'
    
    Run Code Online (Sandbox Code Playgroud)

    回复:

    Hello World
    This is a new line
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第二个命令:

    echo $"Hello World\nThis is a new line"
    
    Run Code Online (Sandbox Code Playgroud)

    回复:

    Hello World\nThis is a new line
    
    Run Code Online (Sandbox Code Playgroud)

我的问题是$' '$" "in包裹的字符串与用bash's包裹的字符串有什么区别echo

Dop*_*oti 11

正如这里所解释的,语法$'string'指定了一个 C 风格的字符串,其中包含魔法转义字符,例如\n换行符。 $"string"用于 I18N 扩展,它没有这样的魔法转义。

请注意,这些不同于更常见的"string"(弱引用)和'string'(强引用)。


sjs*_*sam 9

$在字符串中的开头:

echo $'Hello World\nThis is a new line'
Run Code Online (Sandbox Code Playgroud)

导致转义序列被解释。

Bash 参考手册[ 说 ]

$'string' 形式的词被特殊处理。单词扩展为字符串,并按照 ANSI C 标准的规定替换反斜杠转义字符。..
..
扩展结果是单引号的,就好像美元符号不存在一样。

echo $"Hello World\nThis is a new line"
Run Code Online (Sandbox Code Playgroud)

是完全不同的。这[文章]上设置特定的翻译说:

以美元符号 ('$') 开头的双引号字符串将使该字符串根据当前语言环境进行翻译。如果当前语言环境是 C 或 POSIX,则忽略美元符号。如果字符串被翻译和替换,则替换是双引号。


注: IIRC都$'string'$"string"可能无法找到不同的炮弹的支持。来自其他 shell 的人不仅会好奇地看着它们,而且还会争论是否可以为了脚本可移植性而避免这种情况。

  • `$'xxx'` 不是 bashism,而是由 `ksh` 在 `bash` 之前几年首次引入。目前,`zsh` 和 `busybox sh` 也支持它,并且正在接受 POSIX 标准的审查。 (4认同)