天天看點

shell printf指令詳解

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] ~]$