printf 命令用于格式化輸出, 是echo命令的增強(qiáng)版。它是 C 語(yǔ)言 printf()庫(kù)函數(shù)的一個(gè)有限的變形,并且在語(yǔ)法上有些不同。
注意:printf 由 POSIX 標(biāo)準(zhǔn)所定義,移植性要比 echo 好。
如同 echo 命令,printf 命令也可以輸出簡(jiǎn)單的字符串:
$printf "Hello, Shell\n"
Hello, Shell
$
printf 不像 echo 那樣會(huì)自動(dòng)換行,必須顯式添加換行符(\n)。
printf 命令的語(yǔ)法:
printf format-string [arguments...]
format-string 為格式控制字符串,arguments 為參數(shù)列表。
printf()在 C 語(yǔ)言入門(mén)教程中已經(jīng)講到,功能和用法與 printf 命令類似,請(qǐng)查看:C 語(yǔ)言格式輸出函數(shù) printf()詳解
這里僅說(shuō)明與 C 語(yǔ)言 printf()函數(shù)的不同:
請(qǐng)看下面的例子:
# format-string 為雙引號(hào)
$ printf "%d %s\n" 1 "abc"
1 abc
# 單引號(hào)與雙引號(hào)效果一樣
$ printf '%d %s\n' 1 "abc"
1 abc
# 沒(méi)有引號(hào)也可以輸出
$ printf %s abcdef
abcdef
# 格式只指定了一個(gè)參數(shù),但多出的參數(shù)仍然會(huì)按照該格式輸出,format-string 被重用
$ printf %s abc def
abcdef
$ printf "%s\n" abc def
abc
def
$ printf "%s %s %s\n" a b c d e f g h i j
a b c
d e f
g h i
j
# 如果沒(méi)有 arguments,那么 %s 用 NULL 代替,%d 用0代替
$ printf "%s and %d \n"
and 0
# 如果以 %d 的格式來(lái)顯示字符串,那么會(huì)有警告,提示無(wú)效的數(shù)字,此時(shí)默認(rèn)置為0
$ printf "The first program always prints'%s,%d\n'" Hello Shell
-bash: printf: Shell: invalid number
The first program always prints 'Hello,0'
$
注意,根據(jù) POSIX 標(biāo)準(zhǔn),浮點(diǎn)格式%e、%E、%f、%g與%G是“不需要被支持”。這是因?yàn)?awk 支持浮點(diǎn)預(yù)算,且有它自己的 printf 語(yǔ)句。這樣 Shell 程序中需要將浮點(diǎn)數(shù)值進(jìn)行格式化的打印時(shí),可使用小型的 awk 程序?qū)崿F(xiàn)。然而,內(nèi)建于 bash、ksh93 和 zsh 中的 printf 命令都支持浮點(diǎn)格式。