bash 的內建命令「printf」小結

时间:2022-06-05 02:34:43
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 ~]$