使用有什么区别
echo -e "Hello\nWorld"
和
echo $"Hello\nWorld"
它们不是都输出:
Hello
World
答案1
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
并未得到 shell 的普遍支持,许多人认为该-e
选项是一个设计错误。观察:
$ ls
-e -n
$ echo *
$ printf "%s\n" *
-e
-n
如您所见,如果您要打印的内容echo
以破折号开头,结果可能会出乎意料。除非您确定要打印的第一个字符串echo
不以破折号开头,否则最好使用printf
。
由于这些原因,POSIX 标准总结:
鼓励新的应用程序使用 printf 而不是 echo。
bash
切特·雷米(Chet Ramey)在过去 22 年里一直坚持同意:
[N] ew 代码应该使用 printf。