printf 是bash 2.0X ~ 3.X 的內建命令, 跟內建命令「echo」一樣,都是把訊息
打印到終端上,不同之處是printf 具有更多的選項和格式化的工能,看命令的名
字就是 「print formatted」 的意思。
printf 格式化的的選項如下
%a -- 十六進制浮點數字,用 lowercase letter 顯示
ex: printf "%a\n" 16
在% 和 a 之間可用數字控制顯示格式,如
printf "%50a\n" 16
看有什麼分別?
%A -- 如上,以 uppecase letter 顯示
%b -- 將 \ 的結果擴展
ex: printf "%b\n" \\100
%c -- 顯示一個單一的子母
ex: printf "%c\n" string
得到 s , 和%a 一樣,可在兩者之間用數字控制顯示格式,
%d -- 整數
ex: printf "%d\n" 100000
它還支援數字用「,」由高位每三個數字以「,」分開,格式是
printf "%'d\n" 10000000
%e -- 以科學記號法浮點數顯示
ex: printf "%e\n" 10.00
%f -- 浮點數顯示
ex: printf "%f\n" 10
此外它也支援像 %d 的 "%'d" 格式,這是本板高手火兄的發現,謝謝。:)
%g -- 據手冊所說是樣 bash 根據數值在 %e 和 %f 之間選擇顯示形式,但我的
測試卻像 seq -f 的'%g' 的數字顯示方式, 在 % 和 g 之間插入 「0數字」
的方式就會在不足的整數前面加上一些「0」 , 如
printf "%03g" 1 2 12 123 得到 001 002 012 123
在 % 和 g 之間沒 「0」 的數字視為控制顯示格式。
%i -- 和 %d 一樣
%o -- 以八進制顯示數字,只能用整數
ex: printf "%o\n" 8
%q -- 倨手冊原文為
Quote a string so it can be read properly by a shell script
大意為以 " " 保護字符使腳本正確讀入,因試不出來,還望高人指教,
%s -- 和%q 相反,原文為
Display an unquoted string
我試出%s 和 %q 的結果為
[victor@localhost ~]$ printf "%q\n" str
str
[victor@localhost ~]$ printf "%q\n" str
str
[victor@localhost ~]$ printf "%s\n" str
str
[victor@localhost ~]$ printf "%s\n" ""str""
str
[victor@localhost ~]$ printf "%q\n" ""str""
str
[victor@localhost ~]$ printf "%q\n" '"str"'
\"str\"
[victor@localhost ~]$ printf "%q\n" "'str'"
\'str\'
[victor@localhost ~]$ printf "%q\n" "\'str\'"
\\\'str\\\'
[victor@localhost ~]$ printf "%s\n" "\'str\'"
\'str\'
%u -- 這個也是顯示整數,跟 %d 差不多, 也支援 "%'" 的格式,但在測試下
發現它和 %d 如以以下方式打印字符的話,不但不會報錯,還返回一些
數字
[victor@localhost ~]$ printf "%u\n" '"str"'
115
[victor@localhost ~]$ printf "%u\n" str
bash: printf: str: invalid number
0
[victor@localhost ~]$ printf "%u\n" 115
115
[victor@localhost ~]$ printf "%u\n" "str"
bash: printf: str: invalid number
0
[victor@localhost ~]$ printf "%u\n" '"str"'
115
[victor@localhost ~]$ printf "%'u\n" 1234
1,234
[victor@localhost ~]$ printf "%d\n" '"str"'
115
[victor@localhost ~]$ printf "%d\n" "'str'"
115
[victor@localhost ~]$ printf "%d\n" "'fuck'"
102
[victor@localhost ~]$ printf "%u\n" "'fuck'"
102
[victor@localhost ~]$
不明,請高手指點,謝謝。
%x -- 以十六進制整數 lowercase letter顯示數字
ex: printf "%x\n" 16
它也支援像 「%0數字g」的方式,整數不足指定的數位在前面加上 「0」
%X -- 同上,以 Uppercase letter 顯示數字
%% -- 就是顯示 %
printf 也可將八進制的數字顯示成十進制,方法是在八進制的數字前加上「\」和
「0」, 如 printf "%d\n" \0101
其它如 \b 就是倒格(backspace) , \f Form feed , \n 是新行 ,\r 回鍵 ,\t 是 tab
, \v vertical tab , \' 是 single quote character ,\\ 就是一個 「\」。
最後,太長的數字 printf 會報錯,
[victor@localhost ~]$ printf "%d\n" 123456789123456789012
bash: printf: warning: 123456789123456789012: 數值運算結果超出範圍
9223372036854775807
[victor@localhost ~]$