bash中printf和echo的区别

Kev*_*rke 59 bash

printfbash中的echo函数和函数有什么区别?

具体来说,运行:

echo "blah" >/dev/udp/localhost/8125
Run Code Online (Sandbox Code Playgroud)

没有将“blah”命令发送到侦听 8125 的服务器,而

printf "blah" >/dev/udp/localhost/8125
Run Code Online (Sandbox Code Playgroud)

发送了数据。printf 在输出结束时发送额外的 EOF 吗?

J. *_*bal 64

两个echoprintf是内置命令(printf是击内置自V2.0.2,1998年)。echo总是以 0 状态退出,并简单地在标准输出上打印参数后跟行尾字符,同时printf允许定义格式化字符串并在失败时给出非零退出状态代码。

printf对输出格式有更多的控制。它可用于指定项目使用的字段宽度,以及数字的各种格式选择(例如使用什么输出基数、是否打印指数、是否打印符号以及在后面打印多少位数字)小数点)。这是通过提供格式字符串来完成的,该字符串控制打印其他参数的方式和位置,并具有与 C 语言相同的语法(%03d, %e, %+d,...)。这意味着在不谈论格式 ( %%)时,您必须转义百分比符号。

可能,如果您添加echo默认使用的换行符(使用-n选项时除外),您将获得相同的效果。

printf "blah\n" >/dev/udp/localhost/8125
Run Code Online (Sandbox Code Playgroud)

关于性能,我一直认为这echoprintf后者更快,因为后者必须读取字符串并对其进行格式化。但是用time(也是内置的)测试它们的结果却不然:

$ time for i in {1..999999}; do echo "$i" >/dev/null; done
real    0m10.191s
user    0m4.940s
sys 0m1.710s

$ time for i in {1..999999}; do printf "$i" >/dev/null; done
real    0m9.073s
user    0m4.690s
sys 0m1.310s
Run Code Online (Sandbox Code Playgroud)

告诉printf添加换行符,就像echo默认情况下一样:

$ time for i in {1..999999}; do printf "$i\n" >/dev/null; done
real    0m8.940s
user    0m4.230s
sys 0m1.460s
Run Code Online (Sandbox Code Playgroud)

这显然比不打印要慢\n,但比不打印要快echo

  • 自 2.0.2 (1998) 以来,`printf` 一直是内建的 `bash`,而不是 4.1(.7 将识别错误修复补丁,因此不能引入新功能)。 (8认同)
  • 如果无法写入输出,`echo` 可以返回非零退出状态。 (7认同)
  • 无法验证性能测试。这些给了我相反的结果。我这边的 echo 速度更快(bash 4.3.46)。:-/ (3认同)

Dav*_*rtz 28

不同之处在于echo在其输出的末尾发送一个换行符。没有办法“发送”EOF。

  • 还有比这更多的差异。 (52认同)
  • 尽管这个答案确实(轻松地)解释了为什么第一个命令和第二个命令不同,但这正是凯文要问的。 (4认同)

Mik*_*ike 9

这可能是 echo 与 printf 的最佳描述

http://www.in-ulm.de/~mascheck/various/echo+printf/

在非常高的层次上.. printf 就像 echo 但可以完成更多的格式化。

  • 很好的参考,但不是问题的真正答案,也不是解释为什么 `printf` 有效而 `echo` 无效的原因。 (3认同)

Gil*_*il' 8

echo打印其参数,后跟换行符。对于多个参数,它们之间用空格分隔。根据 unix 变体、shell 和 shell 选项,它还可能解释一些以 开头的转义序列\,并且如果第一个参数以 开头,它可能会将它们视为选项-

printf将其第一个参数解释为格式,并将后续参数解释为%说明符的参数。除非您指定换行符,否则不会添加换行符。在第一个参数中,除两个字符外的所有字符均按字面解释:%启动 printf 说明符,并\启动转义序列(例如,\n对于换行符)。

因为不同的 shell 工作方式不同,echo "$string"并不总是打印指定的字符串加换行符。打印字符串的可靠方法是printf %s "$string"。如果您想在字符串后添加换行符,请编写printf '%s\n' "$string"

在您的情况下,假设blah不以 a-或 contains %or开头\,两个命令之间的唯一区别是echo添加换行符和printf不添加换行符。

  • 请注意,“printf”也会将以“-”开头的前导参数视为选项,但与“echo”相反,您可以使用“--”来标记选项的结尾,如“printf -- ”--%s --\n' foo bar` (6认同)

Tul*_*ova 5

如果您想按字面意思打印字符串“-e”,则使用 echo 会遇到困难。最近在写脚本的时候遇到了这样的问题。

我必须使用 prinf 才能打印文字字符串“-e”。