shell printf命令:格式化輸出語句
注意:使用printf的腳本比使用echo移植性好。
如同echo命令,printf命令可以輸出簡單的字符串:
[root@master ~]#printf "Hello, Shell\n"
Hello, Shell
printf不像echo那樣會自動提供一個換行符號。你必須顯式地將換行符號指定成\n。
printf命令的完整語法有兩個部分:
printf的語法格式:printf format-string [arguments...]
第一部分為描述格式規格的字符串,用來描述輸出的排列方式,最好為此字符串加上引號。
此字符串包含按字面顯示的字符以及格式聲明,格式聲明時特殊的占位符,用來描述如何顯示相應的參數。
第二部分是與格式聲明相對應的參數列表,例如一系列的字符串或變量值。格式聲明由兩部分組成:
百分比符號(%)和指示符。最常用的格式指示符有兩個,%s用于字符串,而%d用于十進制整數。
格式字符串中,一般字符會按字面顯示。轉義序列則像echo那樣,解釋后再輸出成相應的字符。格式聲明以%符號開頭,并以定義的字母集中的一個來結束,用來控制相應參數的輸出。例如%s用于字符串的輸出:
[root@master ~]# printf "The first program always prints'%s,%d\n'" Hello Shell
-bash: printf: Shell: invalid number
The first program always prints 'Hello,0
當嘗試以%d的格式來顯示字符串Shell時,會發現有警告,提示Shell為無效的數字,此時會打印出默認值0;從這個試驗中可以看出來:%s, %s兩側的單引號''并不是必須的。
printf的轉義序列:
\a 警告字符,通常為ASCII的BEL字符
\b 后退
\c 抑制(不顯示)輸出結果中任何結尾的換行字符(只在%b格式指示符控制下的參數字符串中有效),而且,任何留在參數里的字符、任何接下來的參數以及任何留在格式字符串中的字符,都被忽略
\f 換頁(formfeed)
\n 換行
\r 回車(Carriage return)
\t 水平制表符
\v 垂直制表符
\ 一個字面上的反斜杠字符
\ddd 表示1到3位數八進制值的字符。僅在格式字符串中有效
\0ddd 表示1到3位的八進制值字符
默認情況下,轉義序列只在格式字符串中會被特別對待,也就是說,如果轉義序列出現在參數列表的字符串中,將不會被解釋:
[root@master ~]#printf "a string, no processing:<%s>\n" "A\nB"
當你使用%b格式指示符時,printf會解釋參數字符串里的轉義序列:
[root@master ~]#printf "a string, no processing:<%b>\n" "A\nB"
無論時在格式字符串內還是在使用%b所打印的參數字符串里,大部分的轉義序列都是被相同對待。無論如何,\c與\0ddd只有搭配%b使用才有效,而\ddd只有在格式字符串里才會被解釋。
printf格式指示符
%b 相對應的參數被視為含有要被處理的轉義序列之字符串。
%c ASCII字符。顯示相對應參數的第一個字符
%d, %i 十進制整數
%e 浮點格式
%E 浮點格式
%f 浮點格式
%g %e或%f轉換,看哪一個較短,則刪除結尾的零
%G %E或%f轉換,看哪一個較短,則刪除結尾的零
%o 不帶正負號的八進制值
%s 字符串
%u 不帶正負號的十進制值
%x 不帶正負號的十六進制值,使用a至f表示10至15
%X 不帶正負號的十六進制值,使用A至F表示10至15
%% 字面意義的%
根據POSIX標準:浮點格式%e、%E、%f、%g與%G是“不需要被支持”。這是因為awk支持浮點預算,且有它自己的printf語句。這樣Shell程序中需要將浮點數值進行格式化的打印時,可使用小型的awk程序實現。然而,內建于bash、ksh93和zsh中的printf命令都支持浮點格式。
數值精度的定義精度的意義:
%d,%i,%o,%u,%x,%X 要打印的最小位數。當值的位數小于此數字時,會在前面補零。默認精度(precision)為1
%e,%E 要打印的最小位數。當值的位數小于此數字時,會在小數點后面補零,默認精度為6.精度為0時則表示不顯示小數點
%f 小數點右邊的位數
%g,%G 有效位數(significant digit)的最大數目
%s 要打印字符的最大數目
轉載于:https://blog.51cto.com/amazing61/2063846