使用字符串外的$字符进行Bash回显

时间:2012-08-07 02:50:30

标签: linux bash echo

任何人都可以解释

之间的区别
echo $"Starting $CMD" 

echo "String $CMD"

他们似乎看起来一样。

2 个答案:

答案 0 :(得分:6)

查看QUOTING手册页的bash部分:

  

$'string'形式的单词是专门处理的。这个词扩展到了   字符串,反斜杠转义字符被替换为   ANSI C标准。反斜杠转义序列(如果存在)将被解码为   如下:

     
      
  • \ a alert(bell)
  •   
  • \ b退格
  •   
  • \ e一个逃脱角色
  •   
  • \ f form feed
  •   
  • \ n新行
  •   
  • \ r \ n回车
  •   
  • \ t水平标签
  •   
  • \ v vertical tab
  •   
  • \ backslash
  •   
  • \'单引号
  •   
  • \ nnn八位字符,其值为八进制值nnn(一到三位数)
  •   
  • \ xHH八位字符,其值为十六进制值HH(一个或两个十六进制数字)
  •   
  • \ cx a control-x character
  •   
     

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

请注意以下说明双引号字符串前面加$$"string"):

  

以美元符号($)开头的双引号字符串将导致该字符串   根据当前的语言环境进行翻译。如果当前区域设置为C.   或POSIX,美元符号被忽略。如果字符串被翻译并且   更换,替换是双引号。

答案 1 :(得分:4)

$""是一种用于语言翻译的引用形式。如果使用-D标志调用bash,它将打印出所有这些字符串。如果语言区域为CPOSIX,则此形式的引用不会执行任何操作。

gettext使用这些字符串来查找适当的翻译。例如,如果您的脚本具有字符串$"Hello, World"并且您已正确安装MO文件以将该字符串转换为例如法语,则可以通过以下方式执行脚本:

LANGUAGE=fr_FR ./yourscript

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

翻译不是魔术或自动翻译,所以you must provide the translation engine with whatever translation strings it doesn't already have

(PS - 我链接到的指南确实提到了this security bug,但如果你浏览,你可能会错过它,所以我在这里再次强调它。)