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

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

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

  1. 第一个命令:

    echo $'Hello World\nThis is a new line'
    

    回复:

    Hello World
    This is a new line
    
  2. 第二条命令:

    echo $"Hello World\nThis is a new line"
    

    回复:

    Hello World\nThis is a new line
    

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

答案1

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

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

答案2

位于$中字符串的开头:

echo $'Hello World\nThis is a new line'

导致转义序列被解释。

Bash 参考手册[说]

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

echo $"Hello World\nThis is a new line"

是完全不同的。这[ 文章 ]关于特定于语言环境的翻译说:

前面带有美元符号 ('$') 的双引号字符串将导致根据当前区域设置翻译该字符串。如果当前语言环境是 C 或 POSIX,则忽略美元符号。如果字符串被翻译并替换,则替换内容将被双引号括起来。


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

相关内容