Answers:
优选和使用最广泛的不是同一件事。虽然printf由于多种原因而更好,但大多数人仍在使用,echo因为语法更简单。
您首选的主要原因printf是:
echo 未标准化,它将在不同系统上表现不同。您很难预测自己实际运行的时间echo foo。为了说明,在我的Debian系统上:
$ type -a echo
echo is a shell builtin
echo is /bin/echo
如您所见,有两种不同的echo命令,一种是内置的shell(在本例中为bash),另一种是单独的二进制文件。请注意,它bash也具有printf内置函数,但其行为更加标准化,因此不再是问题(感谢@RaduRădeanu指出)。
由于echo支持命令行开关的某些(但不是全部)实现,因此很难打印以a开头的字符串-。尽管许多程序都支持--表示开关的结尾和参数的开头(例如,grep -- -a file将在file包含的行中查找-a),echo但不能。那么,您如何echo打印-n?
$ echo -n ## no output
$ echo '-n' ## no output
$ echo "-n" ## no output
$ echo \-n ## no output
$ echo -e '\055n' ## using the ASCII code works but only on implementations
-n ## that support -e
printf 可以轻松做到这一点:
$ printf -- '-n\n'
-n
$ printf '%s\n' -n
-n
$ printf '\055n\n'
-n
要获得比您想知道的printf更好的信息echo,请参阅http://unix.stackexchange.com上类似问题的答案:
printf作为更好的口译员。
printf(请参阅参考资料type -a)。
echo根本上讲零客观的技术优势。那是对的吗?
echo而不是的唯一原因printf是格式可以更简单。如果您知道要打印的内容,echo foo则比更快,更容易键入printf 'foo\n'。除此之外,在编写需要打印变量的脚本时,永远没有充分的理由使用echo。
询问哪个更可取本身是不完整的。
如果只希望发出一行或多行以换行符结尾的文本,则回显就足够了。如果打算使用更巧妙的方法,特别是包括不包含换行符的“分行”,那么printf最适合该目的。
echo实现的不同,使用可以轻松完成“避免换行” echo -n。实际上,这-n是echo的最可移植的功能。根据POSIX的说法,SystemV缺少此功能,但大多数Unices中都存在。
-nBSD和SystemV,但是我不知道其他任何事情。