echo -e“ <string>”和echo $“ <string>”之间的区别


20

使用之间的区别是什么

echo -e "Hello\nWorld" 

echo $"Hello\nWorld" 

他们都不都输出:

Hello
World

1
你试过了吗?第二个输出Hello\nWorld。您需要使用-e开关来解释转义符。
becko 2014年

4
对于第二个,我怀疑您打算用单引号将其编写echo $'Hello\nWorld',这将在bash下打印成两行。
2014年

@becko,是的,我尝试过,它们都输出相同的精确值。
2014年

Answers:


33

echo -e并且echo $'...'两者都相似,因为它们支持以下转义序列:

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
  \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
  \UHHHHHHHH
         the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

他们确实有差异。除上述内容外,还echo -e支持:

  \c     suppress further output
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)

相比之下,$'....'支持:

 \'     single quote
 \"     double quote
 \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
 \cx    a control-x character

观察到两者之间的\c扩展是不兼容的:

$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop

对于echo -e上述内容,\c抑制进一步的输出,从而忽略Istop。相反,对于$'...',则将\cI解释为制表符。

外观类似的形式: $"..."

与相比$'...',的功能$"..."完全不同。它将导致其中包含的字符串根据当前语言环境进行翻译。

echo -e争议

echo -e并不是外壳程序普遍支持的,许多人认为该-e选项是设计错误。观察:

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

如您所见,如果您要打印的内容以echo破折号开头,则结果可能是意外的。除非您确定要打印的第一个字符串echo不以破折号开头,否则最好使用printf

由于这些原因,POSIX标准得出以下结论

鼓励新的应用程序使用printf代替echo。

拥有bash22年历史的Chet Ramey 同意

[N]少量代码应使用printf。


1
同样值得注意的是,ChetPOSIX都建议使用printf而不是echo
geirha

@geirha很好。答案已更新。
John1024

1
全局(如*)产生意外选项的问题实际上不是特定的echo。任何能识别短选项或长选项(以传统方式编写)并采用文件名操作数(包括ls)的命令都会发生这种情况。可以说情况会变得更糟echo因为(正如您的资料所述)echo,(通常不接受)--指示选项的结束,而人们可以编写类似的命令ls -- *l。(实际上,当使用以*或开头的glob时-,尤其是在脚本中,通常应该这样编写命令。)
Eliah Kagan 2014年

谢谢你的完整的答案,我有我的操作系统的锻炼; Tibial当然,我需要使用打印出一些文字\n转义序列,所以其实并不重要,如果我使用echo -e '...'echo $'...'echo $"..."
马克
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.