鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)三十四天---printf 詳解
shell 學(xué)習(xí)四十五天---xargs
shell學(xué)習(xí)第三天
shell 學(xué)習(xí)十五天---join 連接字段
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)四十三天---臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)第六天---小結(jié)
shell 學(xué)習(xí)三十三天---關(guān)于重定向
shell 學(xué)習(xí)二十九天---循環(huán)
shell 學(xué)習(xí)二十四天---提取開頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第十天---sed 查找與替換
shell 學(xué)習(xí)第十一天---sed 正則的精確控制
shell 學(xué)習(xí)三十天---break,continue,shift,getopts
shell 學(xué)習(xí)---小結(jié)
shell 學(xué)習(xí)三十一天---函數(shù)問題
shell 學(xué)習(xí)第四天---華麗的 printf 輸出
shell 學(xué)習(xí)三十五天---波浪號(hào)展開與通配符
shell 學(xué)習(xí)十九天---文本塊排序
shell 學(xué)習(xí)十二天---行與字符串
shell 學(xué)習(xí)二十一天---重新格式化段落
shell 學(xué)習(xí)十八天---文本排序
shell 學(xué)習(xí)十三天---sed 案例分析
shell 學(xué)習(xí)四十一天---列出文件 ls 和 od 命令
shell 學(xué)習(xí)十七天---awk 命令
shell 學(xué)習(xí)三十六天---命令替換
shell 學(xué)習(xí)十六天---join 練習(xí)
shell 學(xué)習(xí)三十二天---read 讀取一行
shell 學(xué)習(xí)二十二天---計(jì)算行數(shù),字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)小總結(jié)---本章小結(jié)
shell 學(xué)習(xí)第八天---擴(kuò)展正則表達(dá)式(ERE)
shell 學(xué)習(xí)四十二天---使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)二十八天---case 語句
shell 學(xué)習(xí)三十九天---內(nèi)建命令
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)三十四天---printf 詳解
shell 學(xué)習(xí)二十六天---變量與算數(shù)
shell 學(xué)習(xí)三十八天---執(zhí)行順序和 eval
shell 學(xué)習(xí)四十四天---尋找文件
shell 學(xué)習(xí)二十五天---神器的管道符
shell 學(xué)習(xí)十四天---使用 cut 選定字段
shell 學(xué)習(xí)第五天---基本的I/O重定向
shell 學(xué)習(xí)四十天---awk 的驚人表現(xiàn)
shell 學(xué)習(xí)二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)二十三天---打印
shell 學(xué)習(xí)第九天---分組
shell 學(xué)習(xí)四十八天---文件校驗(yàn)和匹配
shell 學(xué)習(xí)二十七天---退出狀態(tài)和 if 語句
shell 學(xué)習(xí)四十七天---文件比較 cmp,diff,patch
shell 學(xué)習(xí)第七天---基礎(chǔ)正則表達(dá)式(BRE)
shell 學(xué)習(xí)四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)三十七天---引用
shell 學(xué)習(xí)小結(jié)

shell 學(xué)習(xí)三十四天---printf 詳解

先來看一個(gè)簡(jiǎn)單的例子:使用命令printf “hello,world\n”,
輸出:hello,world
再使用echo “hello,world\n”,輸出為:hello,world\n
案例二:使用命令printf "%s\n" hello,world
輸出結(jié)果為:hello,world
printf 命令的完整語法有兩個(gè)部分:
printg format-string [arguments]
第一部分為描述格式規(guī)格的字符串,他的嘴尖提供方式是放在引號(hào)內(nèi)的字符串常熟.
第二部分為參數(shù)列表,例如字符串或變量值的列表,該列表需與格式規(guī)格相對(duì)應(yīng).
格式字符串結(jié)合要以字面意義輸出的文本,它使用的規(guī)格是描述如何在 printf 命令行上格式化一連串的參數(shù).一般字符都按照字面上的意義輸出.主義序列會(huì)被解釋(與ehco相似),然后輸出為相應(yīng)的字符.格式指示符是以%字符開頭且由已定義的字母集之一作為結(jié)尾,用來控制接下來想對(duì)應(yīng)參數(shù)的輸出.

printf 的語法:
printf format [string]
用途:
為了從 shell 腳本中產(chǎn)生輸出.由于 printf 的行為是由 POSIX 標(biāo)準(zhǔn)所定義,因此使用 printg 的腳本比使用 echo 更具可移植性.
主要選項(xiàng):

行為:
printf 使用 format 字符串控制輸出.字符串里的純字符都會(huì)如實(shí)打印.echo 的轉(zhuǎn)義序列會(huì)被解釋.包括%與一個(gè)字母的格式指示符.用來指示相對(duì)應(yīng)的參數(shù)字符串的格式化.

??????????????????printf的轉(zhuǎn)義序列

序列

說明

\a

警告字符,通常為ASCIIBEL字符

\b

后退

\c

抑制(不顯示)輸出結(jié)果中任何結(jié)尾的換行字符;而且,任何留在參數(shù)里的字符,任何接下來的參數(shù)以及任何留在格式字符串中的字符,都被忽略

\f

換頁

\n

換行

\r

回車

\t

水平制表符

\v

垂直制表符

\\

一個(gè)字面上的反斜杠字符

\ddd

表示13位數(shù)八進(jìn)制的字符.盡在格式字符串中有效

\0ddd

表示13位的八進(jìn)制字符

轉(zhuǎn)義序列只在格式字符串中會(huì)被特別對(duì)待,也就是說,出現(xiàn)在參數(shù)字符串里的專利序列不會(huì)被解釋:
使用命令:printf "%s\n" "abc\ndef"
輸出結(jié)果:abc\ndef

??????????????????printf格式指示符

%c

ASCII字符.顯示相對(duì)應(yīng)參數(shù)的第一個(gè)字符

%d,%i

十進(jìn)制整數(shù)

%e

浮點(diǎn)格式([-d].precisione?[+-dd])

%E

浮點(diǎn)格式([-d].precisionE?[+-dd])

%g

%e%f轉(zhuǎn)換,看哪一個(gè)較短,則刪除結(jié)尾的零

%G

%E%f轉(zhuǎn)換,看哪一個(gè)較短,則刪除結(jié)尾的零

%s

字符串

%u

不帶正負(fù)號(hào)的十進(jìn)制值

%x

不帶正負(fù)號(hào)的十六進(jìn)制.使用af表示1015

%%

字面意義的%

%X

不帶正負(fù)號(hào)的十六進(jìn)制.使用AF表示1015

??????????????????????精度的含義

轉(zhuǎn)換

精度含義

%d,%i,%o,%u,%x,%X

要打印的最小位數(shù).當(dāng)值的位數(shù)少于此數(shù)字時(shí),會(huì)在前面補(bǔ)零.默認(rèn)精度為1

%e,%E

要打印的最小位數(shù).當(dāng)值的位數(shù)少于此數(shù)字時(shí),會(huì)在小數(shù)點(diǎn)后面補(bǔ)零,默認(rèn)為精度為6.精度為0則表示不顯示小數(shù)點(diǎn)小數(shù)點(diǎn)右邊的位數(shù)

%f

小數(shù)點(diǎn)右邊的位數(shù)

%g,%G

有效位數(shù)的最大數(shù)目

%s

要打印字符的最大數(shù)目

案例一:
使用命令:printf "%.5d\n" 15
輸出:00015
案例二:
使用命令:printf "%.10s\n" "a very long string"
輸出:a very lon
案例三:
使用命令:printf "%.2f\n" 123.4567
輸出:123.46

???????????????????printf的標(biāo)志

字符

意義

-

將字段里已格式化的值向左對(duì)齊

空格(space)

在正值前置一個(gè)空格,在負(fù)值前置一個(gè)負(fù)號(hào)

+

總是在數(shù)值之前放置一個(gè)正號(hào)或負(fù)號(hào),即便是正值也是

#

下列形式選擇其一:%o有一個(gè)前置的o;%x%X分別前置的0x0X.%e,%E%f總是在結(jié)果中有一個(gè)小數(shù)點(diǎn);%g%G為沒有結(jié)尾的零.

0

以零填補(bǔ)輸出,而非空白.這僅發(fā)生在字段寬度大于轉(zhuǎn)換后的情況.C語言里,該標(biāo)志應(yīng)用到所有輸出格式,及時(shí)是非數(shù)字的值也是一樣.對(duì)于printf命令而言,它僅應(yīng)用到數(shù)值格式

案例一:
使用命令:printf "%-20s%-15s%10.2f\n" "Shan" "zhang" 35
輸出:Shan zhang 35.00
分析:
%-20s 表示一個(gè)左對(duì)齊、寬度為 20 個(gè)字符字符串格式,不足 20 個(gè)字符,右側(cè)補(bǔ)充相應(yīng)數(shù)量的空格符。
%-15s 表示一個(gè)左對(duì)齊、寬度為 15 個(gè)字符字符串格式。
%10.2f 表示右對(duì)齊、10 個(gè)字符長(zhǎng)度的浮點(diǎn)數(shù),其中一個(gè)是小數(shù)點(diǎn),小數(shù)點(diǎn)后面保留兩位。
案例二:
使用命令:printf "|%10s|\n" hello
輸出:| hello|
分析:%10s 表示右對(duì)齊,寬度為 10 的字符串,如不足是個(gè)字符串,左側(cè)補(bǔ)充相應(yīng)數(shù)量的空格數(shù).
案例三:
使用命令:printf "|%-10s|\n" hello
輸出:|hello |
分析:和案例二比較一下
案例四:
使用命令:printf "%x %#x\n" 15 15
輸出:f 0xf
分析:如果#標(biāo)志和%x,%X 搭配使用,在輸出十六進(jìn)制數(shù)字時(shí),前面回家 0x 或者 0X 前綴.
使用標(biāo)志符的作用主要是為了動(dòng)態(tài)的指定寬度和精度.

綜合案例分析:
字符串向左向右對(duì)齊案例:
使用命令:printf "|%-10s| |%10s|\n" hello world
輸出|hello | | world|
空白標(biāo)志案例:
使用命令: printf "|% d| |% d|\n" 15 -15
輸出:| 15| |-15|
+標(biāo)志案例:
使用命令:printf "|%+d| |%+d|\n" 15 -15
輸出:|+15| |-15|

標(biāo)志案例:

使用命令:printf "%x || %#X\n" 15 15
輸出:f || 0XF
0 標(biāo)志案例:
使用命令:printf "%05d\n" 15
輸出:00015

對(duì)于轉(zhuǎn)換指示符%b,%c 與%s 而言,相對(duì)應(yīng)的參數(shù)都是為字符串.否則,他們會(huì)被解釋為 C 語言的數(shù)字常數(shù)(開頭的 0 位八進(jìn)制,以及開頭的 0x 與 0X 為十六進(jìn)制).更進(jìn)一步說,如果參數(shù)的第一個(gè)字符為單引號(hào)或雙引號(hào),則縣桂英的數(shù)值是字符串的第二個(gè)字符的 ASCII 值:
命令:printf "%s is %d \n" a "'a"
輸出:a is 97

當(dāng)參數(shù)多于格式指示符時(shí),格式指示符會(huì)根據(jù)需要再利用.這種做法在參數(shù)列表長(zhǎng)度未知時(shí)時(shí)很方便的,例如來自通配符表達(dá)式.如果留在格式字符串里剩下的指示符比參數(shù)多時(shí),如果是數(shù)值轉(zhuǎn)換,則遺漏的值會(huì)被看做是零,如果是字符串轉(zhuǎn)換,則被視為空字符串(雖然可以這么用,但比較好的方式應(yīng)該是一一對(duì)應(yīng)關(guān)系,即提供的參數(shù)數(shù)目和格式字符串?dāng)?shù)目相同).如果 printf 無法進(jìn)行格式的轉(zhuǎn)換,便返回一個(gè)非零的退出狀態(tài).