2

谁能解释一下有什么区别

echo $"Starting $CMD" 

echo "String $CMD"

它们看起来一样。

4

2 回答 2

6

查找手册页的QUOTING部分:bash

形式的词$'string'被特殊对待。该单词扩展为字符串,并按照 ANSI C 标准的规定替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:

  • \一个警报(铃)
  • \b 退格
  • \e 转义字符
  • \f 换页
  • \n 换行
  • \r 回车
  • \t 水平制表符
  • \v 垂直制表符
  • \ 反斜杠
  • \' 单引号
  • \nnn 八位字符,其值为八进制值 nnn(一到三位)
  • \xHH 八位字符,其值为十六进制值 HH(一个或两个十六进制数字)
  • \cx 一个 control-x 字符

扩展的结果是单引号的,就好像美元符号不存在一样。

$请注意以下以( )开头的双引号字符串$"string"

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

于 2012-08-07T03:00:38.673 回答
4

$""是一种用于语言翻译的引用形式。如果您使用该-D标志调用 bash,它将打印出所有此类字符串。当语言环境是CorPOSIX时,这种形式的引用不会做任何事情。

这些字符串用于gettext查找适当的翻译。例如,如果您的脚本有字符串$"Hello, World",并且您已经正确安装了 MO 文件以将该字符串翻译成法语,那么您可以这样执行您的脚本:

LANGUAGE=fr_FR ./yourscript

并期望 的所有实例都$"Hello, World"输出为Bonjour, Tout le Monde(假设这是您的翻译文件中的实际内容)。

翻译不是魔术或自动的,因此您必须向翻译引擎提供它还没有的任何翻译字符串

(PS - 我链接的指南确实提到了这个安全漏洞,但是如果你略读一下,你可能会错过它,所以我在这里再次强调它。)

于 2012-08-07T02:57:15.513 回答