Answers:
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。
拥有bash
22年历史的Chet Ramey 同意:
[N]少量代码应使用printf。
*
)产生意外选项的问题实际上不是特定的echo
。任何能识别短选项或长选项(以传统方式编写)并采用文件名操作数(包括ls
)的命令都会发生这种情况。可以说情况会变得更糟echo
因为(正如您的资料所述)echo
,(通常不接受)--
指示选项的结束,而人们可以编写类似的命令ls -- *l
。(实际上,当使用以*
或开头的glob时-
,尤其是在脚本中,通常应该这样编写命令。)
\n
转义序列,所以其实并不重要,如果我使用echo -e '...'
,echo $'...'
或echo $"..."
Hello\nWorld
。您需要使用-e
开关来解释转义符。