先來(lái)看一個(gè)簡(jiǎn)單的例子: 使用命令 printf "hello,world\n"
,
輸出:hello,world
再使用 echo "hello,world\n"
,
輸出為:hello,world\n
案例二: 使用命令 printf "%s\n" hello,world
輸出結(jié)果為:hello,world
printf 命令的完整語(yǔ)法有兩個(gè)部分:
printg format-string [arguments]
printf
命令行上格式化一連串的參數(shù)。一般字符都按照字面上的意義輸出。主義序列會(huì)被解釋 (與 ehco 相似),然后輸出為相應(yīng)的字符。格式指示符是以 %
字符開頭且由已定義的字母集之一作為結(jié)尾,用來(lái)控制接下來(lái)想對(duì)應(yīng)參數(shù)的輸出。printf 的語(yǔ)法:printf format [string]
用途:為了從 shell 腳本中產(chǎn)生輸出。由于 printf 的行為是由 POSIX 標(biāo)準(zhǔn)所定義,因此使用 printg 的腳本比使用 echo 更具可移植性。
主要選項(xiàng):無(wú)
行為:printf 使用 format 字符串控制輸出。字符串里的純字符都會(huì)如實(shí)打印。echo 的轉(zhuǎn)義序列會(huì)被解釋。包括 % 與一個(gè)字母的格式指示符。用來(lái)指示相對(duì)應(yīng)的參數(shù)字符串的格式化。
printf 的轉(zhuǎn)義序列
序列
說(shuō)明
\a
警告字符,通常為 ASCII 的 BEL 字符
\b
后退
\c
抑制 (不顯示) 輸出結(jié)果中任何結(jié)尾的換行字符;而且,任何留在參數(shù)里的字符,任何接下來(lái)的參數(shù)以及任何留在格式字符串中的字符,都被忽略
\f
換頁(yè)
\n
換行
\r
回車
\t
水平制表符
\v
垂直制表符
\\
一個(gè)字面上的反斜杠字符
\ddd
表示 1 到 3 位數(shù)八進(jìn)制的字符。盡在格式字符串中有效
\0ddd
表示 1 到 3 位的八進(jìn)制字符
轉(zhuǎn)義序列只在格式字符串中會(huì)被特別對(duì)待,也就是說(shuō),出現(xiàn)在參數(shù)字符串里的專利序列不會(huì)被解釋:
使用命令:printf "%s\n" "abc\ndef"
輸出結(jié)果:abc\ndef
printf 格式指示符
%c
ASCII 字符。顯示相對(duì)應(yīng)參數(shù)的第一個(gè)字符
%d,%i
十進(jìn)制整數(shù)
%e
浮點(diǎn)格式 ([-d].precisione [+-dd])
%E
浮點(diǎn)格式 ([-d].precisionE [+-dd])
%g
%e 或 %f 轉(zhuǎn)換,看哪一個(gè)較短,則刪除結(jié)尾的零
%G
%E 或 %f 轉(zhuǎn)換,看哪一個(gè)較短,則刪除結(jié)尾的零
%s
字符串
%u
不帶正負(fù)號(hào)的十進(jìn)制值
%x
不帶正負(fù)號(hào)的十六進(jìn)制。使用 a 至 f 表示 10 至 15
%%
字面意義的 %
%X
不帶正負(fù)號(hào)的十六進(jìn)制。使用 A 至 F 表示 10 至 15
精度的含義
轉(zhuǎn)換
精度含義
%d,%i,%o,%u,%x,%X
要打印的最小位數(shù)。當(dāng)值的位數(shù)少于此數(shù)字時(shí),會(huì)在前面補(bǔ)零。默認(rèn)精度為 1
%e,%E
要打印的最小位數(shù)。當(dāng)值的位數(shù)少于此數(shù)字時(shí),會(huì)在小數(shù)點(diǎn)后面補(bǔ)零,默認(rèn)為精度為 6。精度為 0 則表示不顯示小數(shù)點(diǎn)小數(shù)點(diǎn)右邊的位數(shù)
%f
小數(shù)點(diǎn)右邊的位數(shù)
%g,%G
有效位數(shù)的最大數(shù)目
%s
要打印字符的最大數(shù)目
案例一:
使用命令:printf "%.5d\n" 15
輸出:00015
案例二:
使用命令:printf "%.10s\n" "a very long string"
輸出:a very lon
案例三:
使用命令:printf "%.2f\n" 123.4567
輸出:123.46
printf 的標(biāo)志
字符
意義
-
將字段里已格式化的值向左對(duì)齊
空格 (space)
在正值前置一個(gè)空格,在負(fù)值前置一個(gè)負(fù)號(hào)
+
總是在數(shù)值之前放置一個(gè)正號(hào)或負(fù)號(hào),即便是正值也是
#
下列形式選擇其一:%o 有一個(gè)前置的 o;%x 與 %X 分別前置的 0x 與 0X.%e,%E 與 %f 總是在結(jié)果中有一個(gè)小數(shù)點(diǎn);%g 與 %G 為沒(méi)有結(jié)尾的零。
0
以零填補(bǔ)輸出,而非空白。這僅發(fā)生在字段寬度大于轉(zhuǎn)換后的情況。在 C 語(yǔ)言里,該標(biāo)志應(yīng)用到所有輸出格式,及時(shí)是非數(shù)字的值也是一樣。對(duì)于 printf 命令而言,它僅應(yīng)用到數(shù)值格式
案例一:
使用命令:printf "%-20s%-15s%10.2f\n" "Shan" "zhang" 35
輸出:Shan zhang 35.00
分析:
%-20s
表示一個(gè)左對(duì)齊、寬度為 20 個(gè)字符字符串格式,不足 20 個(gè)字符,右側(cè)補(bǔ)充相應(yīng)數(shù)量的空格符。%-15s
表示一個(gè)左對(duì)齊、寬度為 15 個(gè)字符字符串格式。%10.2f
表示右對(duì)齊、10 個(gè)字符長(zhǎng)度的浮點(diǎn)數(shù),其中一個(gè)是小數(shù)點(diǎn),小數(shù)點(diǎn)后面保留兩位。案例二:
使用命令:printf "|%10s|\n" hello
輸出:| hello|
分析:%10s
表示右對(duì)齊,寬度為 10 的字符串,如不足是個(gè)字符串,左側(cè)補(bǔ)充相應(yīng)數(shù)量的空格數(shù)。
案例三:
使用命令:printf "|%-10s|\n" hello
輸出:|hello |
分析: 和案例二比較一下
案例四:
使用命令:printf "%x %#x\n" 15 15
輸出:f 0xf
分析:
%x
,%X
搭配使用,在輸出十六進(jìn)制數(shù)字時(shí),前面回家 0x
或者 0X
前綴。 綜合案例分析:
字符串向左向右對(duì)齊案例:
使用命令:printf "|%-10s| |%10s|\n" hello world
輸出 |hello | | world|
空白標(biāo)志案例:
使用命令:printf "|% d| |% d|\n" 15 -15
輸出:| 15| |-15|
+
標(biāo)志案例:
使用命令:printf "|%+d| |%+d|\n" 15 -15
輸出:|+15| |-15|
#
標(biāo)志案例:
使用命令:printf "%x || %#X\n" 15 15
輸出:f || 0XF
0
標(biāo)志案例:
使用命令:printf "%05d\n" 15
輸出:00015
對(duì)于轉(zhuǎn)換指示符 %b
,%c
與 %s
而言,相對(duì)應(yīng)的參數(shù)都是為字符串。否則,他們會(huì)被解釋為 C 語(yǔ)言的數(shù)字常數(shù) (開頭的 0 位八進(jìn)制,以及開頭的 0x
與 0X
為十六進(jìn)制)。更進(jìn)一步說(shuō),如果參數(shù)的第一個(gè)字符為單引號(hào)或雙引號(hào),則縣桂英的數(shù)值是字符串的第二個(gè)字符的 ASCII 值:
命令:printf "%s is %d \n" a "'a"
輸出:a is 97
當(dāng)參數(shù)多于格式指示符時(shí),格式指示符會(huì)根據(jù)需要再利用。這種做法在參數(shù)列表長(zhǎng)度未知時(shí)時(shí)很方便的,例如來(lái)自通配符表達(dá)式。如果留在格式字符串里剩下的指示符比參數(shù)多時(shí),如果是數(shù)值轉(zhuǎn)換,則遺漏的值會(huì)被看做是零,如果是字符串轉(zhuǎn)換,則被視為空字符串 (雖然可以這么用,但比較好的方式應(yīng)該是一一對(duì)應(yīng)關(guān)系,即提供的參數(shù)數(shù)目和格式字符串?dāng)?shù)目相同)。如果 printf 無(wú)法進(jìn)行格式的轉(zhuǎn)換,便返回一個(gè)非零的退出狀態(tài)。