在脚本中包含$“美元符号前缀的字符串”是什么意思?


81

我刚刚在初始化脚本中看到了这一点:

echo $"Stopping Apache"

那美元符号是做什么用的?

到目前为止,我的研究:

我在bash手册中发现了这一点:

引号

如果设置,$'string'并且$"string"加引号内执行${parameter}双引号括起来的扩展。默认情况下启用此选项。

...但是我没有发现带有和不带有$前缀的字符串之间的任何区别:

$ echo "I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo "I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo 'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in $PWD'
I am in $PWD

Answers:


111

这里发生了两种不同的情况,均记录在bash手册中

$'

美元符号单引号是一种特殊的报价形式:

ANSI C报价

$'string'形式的单词经过特殊处理。该单词扩展为字符串,并按ANSI C标准的规定替换反斜杠转义字符。

$“

美元符号双引号用于本地化:

语言环境翻译

用双引号引起来的字符串加上美元符号('$')会导致该字符串根据当前语言环境进行翻译。如果当前语言环境为C或POSIX,则忽略美元符号。如果字符串被翻译和替换,替换将被双引号引起来。


22

当在中扩展字符串时$'',将解释转义序列。从联机帮助页:

Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.

一个简单的例子是换行符的\ n转义序列:

$ echo 'foo\n'
foo\n
$ echo $'foo\n'
foo

$ 

注意:在其他外壳程序中echo可能会得到不同的结果,这可能会解释转义序列而不提供选项。


8
$"..."根据问题,没有提及。
Peter.O 2012年

-4

您误解了手册。仅当${parameter}扩展使用$引号的字符串时,您才会看到效果。

$ echo "${v:-'ab\ncd'}"
'ab\ncd'
$ echo "${v:-$'ab\ncd'}"
ab
cd

来源和进一步阅读:https : //lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html


6
这不能回答问题:$"…"是不同的东西。
Gilles 2012年

4
抱歉,您的答案是错误的:无需使用${}扩展来利用ANSI引用。检查自己:echo $'ab\ncd'
rozcietrzewiacz 2012年

1
我认为这个答案试图解释extquote不正确,而不是问题在问什么。
jw013 2012年

1
"${...}"不同于$"..."
GypsyCosmonaut
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.