printf 命令模仿 C 程序库(library)里的 printf() 程序。
标准所定义,因此使用printf的脚本比使用echo移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。
默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n。
和 echo 命令一样,printf 命令也可以输出简单的字符串:
eg1:
printf "a b c"
printf "%s \n" "a b c"
结果:
[root@h data]# /bin/sh b.sh
a b ca b c
[root@h data]#
eg2:
printf "a b c"
printf "%s \n" "a b c"
printf "%s \t" "d"
结果:
d[root@h data]# vi b.sh
[root@h data]# /bin/sh b.sh
a b ca b c
d [root@h data]#
注:
printf 不像 echo 那样会自动换行,必须显式添加换行符(\n)。
printf 命令的语法:
printf format-string [arguments...]
format-string 为格式控制字符串,arguments 为参数列表。
printf()在C语言入门教程中包含,功能和用法与 printf 命令类似,请查看:C语言格式输出函数printf()详解
与C语言printf()函数的不同:
printf 命令不用加括号
format-string 可以没有引号(没实现),但最好加上,单引号双引号均可。
参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换。
arguments 使用空格分隔,不用逗号。
eg1:
# format-string为双引号
printf "%d %s\n" 23 "hahaha"
结果:
[root@h data]# /bin/sh c1.sh
23 hahaha
eg2:
# 单引号与双引号效果一样
printf '%d %s\n' 23 'hahaha'
结果:
[root@h data]# /bin/sh c.sh
23 hahaha
eg3-1:
# 没有引号也可以输出(没实现)---一个参数值可以format-string不加任何符号,两个值及以上不加符号未实现
printf %s 23 'hahaha'
结果:
[root@h data]# /bin/sh c1.sh
23hahaha[root@h data]#
eg3-2:
printf %d %s\n 23 hahaha
结果:
[root@h data]# /bin/sh c2.sh
c2.sh: line 1: printf: %sn: invalid number
c2.sh: line 1: printf: hahaha: invalid
eg4-1:
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s 23 'hahaha'
结果:
[root@h data]# /bin/sh c1.sh
23hahaha[root@h data]#
eg4-2:
printf "%s \n" "abc" "def"
结果:
[root@h data]# /bin/sh a.sh
abc
def
eg4-3:
printf %s \n abc def
结果:
[root@h data]# /bin/sh a.sh
nabcdef[root@h data]#
eg4-4:
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
[root@h data]# printf "%s and %d \n"
and 0
eg4-5:
# 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
[root@h data]# printf %d afdvd dfagdfdav
-bash: printf: afdvd: invalid number
-bash: printf: dfagdfdav: invalid number
eg4-6:
[root@h data]# printf %s 1 24 4543 34 23
12445433423[root@h data]#
注意,根据POSIX标准,浮点格式%e、%E、%f、%g与%G是“不需要被支持”。这是因为awk支持浮点预算,且有它自己的printf语句。这样Shell程序中需要将浮点数值进行格式化的打印时,可使用小型的awk程序实现。然而,内建于bash、ksh93和zsh中的printf命令都支持浮点格式。