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


9

我试图使用执行新行,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

我的问题是什么是用包裹串之间的区别$' '与包裹VS字符串$" "bashecho


有用的注释:双引号也称为弱引用,单引号也称为强引用。
拉法夫·塔辛(Rafaf Tahsin)2016年

2
是的,但"weak quote"'strong quote'来自不同$'C String'$"I18N String"
DopeGhoti

您才是真正的MVP。:D >>> @DopeGhoti
Rafaf Tahsin

我尽我所能(:
DopeGhoti '16

Answers:


10

正如解释这里,语法$'string'规定了C风格的字符串,其中包括魔术转义字符,如\n一个换行符。 $"string"是为I18N扩展而设计的,它没有这样的魔术逃脱。

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


9

$在字符串中的开头:

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的人们不仅好奇地看着他们,而且还在争论是否可以避免这种情况以提高脚本的可移植性。


1
ksh93也了解$'...'
库沙兰丹

@Kusalananda:嗯,请注意:)
sjsam '16

4
$'xxx'它不是一种bashism,但在ksh几年前才被引入bash。POSIX标准目前也支持它zshbusybox sh并且正在对其进行审查。
jlliagre

@jlliagre:感谢时间:)。我的立场是正确的..
sjsam '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.