printf指令用于格式化并列印字元到标準輸出,類似c語言的printf(),它由POSIX标準所定義,是以它比 echo指令移植性更好。
文法:
printf [-v var] format-string [arguments...]
參數說明:
- -v var 表示的是将輸出指派給shell變量VAR而不是在标準輸出中顯示它
- format-string: 格式控制字元串,由普通字元、轉義序列和格式指定符組成
- arguments: 參數清單,用于替換格式控制字元串中的變量或占位符的内容
示例:
$ echo "Hello world"
Hello world
$ printf "Hello, printf\n"
Hello, printf
$ printf "Hello %s,my love" baby
Hello baby,my love[[email protected] ~]$
1.上面代碼中,最後一句為格式化輸出,且未列印換行的效果
2.echo指令預設是行尾輸出換行符的,而printf預設不換行
格式化輸出
format-string 完全格式:
%[flags] [width.precision] format-specifier
- %表示後面是格式控制字元
- flags标志符,可省略,主要用于控制補齊等,詳見下表
- width.precision,寬度或精度指定
- format-specifier,格式指定符,詳見下表
示例:
[[email protected] ~]$ printf "數字:%s %s\n" 1 2
數字:1 2
[[email protected] ~]$ printf "數字:%04d %s\n" 1 2
數字:0001 2
[[email protected] ~]$ printf "數字:%-4s %s\n" sb xy
數字:sb xy
[[email protected] ~]$ printf "數字:%4s %s\n" sb xy
數字: sb xy
flags标志符
flag | 意義 |
- | 左對齊。如:%-10s,表示格式化為10個字元的字元串,長度不足則右補空格.預設是右對齊 |
空格(space) | 在正數前置一個空格,在負值前置一個負号 |
+ | 在正數前置一個加号,負值忽略 |
以長度不足時用零填補輸出,僅應用到數值格式。如%05d | |
# | 改變格式數字,如%x會加前導0x,%o加前導0, %b加前導0b |
format-specifier 格式指定符
符号 | 描述 |
%s | 以字元串的格式列印相關參數 |
%d,%i | 以帶符号十進制數的格式列印相關參數 |
%b | 解釋參數字元串裡的轉義序列 |
%q | 以 Shell 引用的格式列印相關參數,使其可以在标準輸入中重用 |
%o | 以無符号八進制數的格式列印相關參數 |
%u | 以無符号十進制數的格式列印相關參數 |
%x,%X | 以無符号小寫十六進制數的格式列印相關參數,%X列印為大寫字母 |
%f | 以浮點數的格式解析并列印相關參數 |
%e,%E | 将參數列印為指數表示法的浮點數。%E列印為大寫字母 |
%g,%G | 以正常或指數表示法将參數列印為浮點數,以更适合給定值和精度的表示法為準。%g列印大寫字母 |
%c | 以字元的格式列印相關參數,并且隻列印參數中的第一個字元 |
%% | 列印一個“%”字元 |
轉義序列
轉義符 | 說明 |
\a | 警告音,通常為ASCII的BEL字元 |
\b | 後退 |
\c | 取消輸出行末換行符 |
\f | 換頁 |
\n | 換行 |
\r | 回車 |
\t | 水準制表符 即tab |
\v | 垂直制表符 |
\ | 一個字面上的反斜杠字元 |
\ddd | 表示1到3位數八進制值的字元。僅在格式字元串中有效 |
\0ddd | 表示1到3位的八進制值字元 |
\xhh | 按照十六進制ASCII碼表輸出字元,其中hh是兩位十六進制數 |
格式指定符與參數個數不比對的情況示例:
[[email protected] ~]$ printf "數字:%s \n" 1 2 34
數字:1
數字:2
數字:34
[[email protected] ~]$ printf "數字:%s %s\n" 1 2 34
數字:1 2
數[[email protected] ~]$ printf "數字:%d , %d,%d\n" 88 6
數字:88 , 6,0
[[email protected] ~]$ printf "數字:%d , %d,%s\n" 88 6
數字:88 , 6,
指定列印寬度示例:
[[email protected] ~]$ printf "數字左補0:%05d\n" 8
數字左補0:00008
[[email protected] ~]$ printf "數字左補0:%.5d\n" 8
數字左補0:00008
[[email protected] ~]$ printf "數字左補空格:%5d\n" 8
數字補空格: 8
[[email protected] ~]$ printf "字元補右空格:%-5s右側|" s
字元補右空格:s |
[[email protected] ~]$ printf "字元右補空格:%5s\n" s
字元左補空格: s
數字列印示例:
# 字母前帶單或雙引号
[[email protected] ~]$ printf "列印字母s的ASCII值:%d \n" "'s"
列印字母s的ASCII值:115
[[email protected] ~]$ printf "列印16進制\n小寫: %x \n大寫: %X \n帶ox前導: %#x \n" 255 255 255
列印16進制
小寫: ff
大寫: FF
帶ox前導: 0xff
[[email protected] ~]$ printf "列印8進制: %o \n前導: %#o \n" 255 255
列印8進制: 377
前導: 0377
[[email protected] ~]$ printf "列印小數: %f\n" 70.897
列印小數: 70.897000
[[email protected] ~]$ printf "列印小數(4舍5入保留2位小數): %.2f\n" 70.897
列印小數(4舍5入保留2位小數): 70.90
[[email protected] ~]$ printf "列印科學計數法: %e\n" 70.897
列印科學計數法: 7.089700e+01
[[email protected] ~]$ printf "列印科學計數法(保留2位小數): %.2e\n" 70.897
列印科學計數法(保留2位小數): 7.09e+01
轉義序列示例:
[[email protected] ~]$ printf "轉義序列,換行\n制表符\t\t|非空白\n"
轉義序列,換行
制表符 |非空白
[[email protected] ~]$ printf "轉義序列,%s新行%s\n" 3\n "3\n"
轉義序列,3n新行3\n
[[email protected] ~]$ printf "轉義序列,%b新行%b\n" 3\n "3\n"
轉義序列,3n新行3
[[email protected] ~]$