对于显示消息和打印数据,有两个命令可用printf
和echo
。
那么它们的用法有何不同?哪一个更可取?
答案1
首选和最广泛使用不是一回事。虽然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
支持命令行开关,因此很难打印以 开头的字符串-
。虽然许多程序支持--
表示开关的结束和参数的开始(例如,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:
答案2
询问哪一个更可取本身就是不完整的。
如果一个人只想发出一行或多行文字以换行符结束,那么 echo 就足够了。如果想要更巧妙一点,特别是包含一个没有换行符的“部分行”,那么 printf 是最好的为了这个目的。