在 Linux 命令行中最簡(jiǎn)單的打印方法是使用 echo 命令:
echo "Value of var is $var"
然而,echo 命令不支持格式化輸出。 要格式化輸出,可以使用 printf 命令,bash 中的 printf 與 c/c++ 中的printf 命令類似:
printf "My brother %s is %d years old.\\n" Prakash 21
其輸出如下所示:
第一個(gè)參數(shù) %s 接受一個(gè)字符串,第二個(gè)參數(shù) %d 接受的是一個(gè)十進(jìn)制整數(shù),就跟 c/c++ 中的一樣。 接下來我們展示一些 bash printf 命令的例子。
bash 中的 printf 命令
printf 命令的語法如下:
printf format [arguments]
這里,format 是一個(gè)字符串,用于確定后續(xù)值的顯示方式。
在上面的例子中 printf "My brother %s is %d years old.\\n" Prakash 21,前面的語句 "My brother %s is %d years old.\\n" 是格式,后面的 Prakash 和 21 是參數(shù),這些參數(shù)用于替換前面格式中的占位符 %s 和 %d。
在最簡(jiǎn)單的方式中,printf 的使用跟 echo 類似:
printf "Hello World\\n"
注意到最后面的換行符 \\n 了嗎? echo 和 printf 命令的區(qū)別在于,echo 命令會(huì)自動(dòng)在末尾添加一個(gè)換行符,但是 printf 命令需要手動(dòng)添加。
要特別注意參數(shù)的類型和數(shù)量
這里需要注意,格式化字符串通常會(huì)嘗試應(yīng)用于所有參數(shù)。 看下面的例子:
$ printf "Hello, %s! \\n" Abhishek Prakash
Hello, Abhishek!
Hello, Prakash!
同時(shí),也需要盡量匹配格式化字符串中所期望的數(shù)據(jù)類型:
通過上面的例子可以看到,如果沒有找到匹配的參數(shù),會(huì)使用默認(rèn)值,默認(rèn)字符串為 null,整數(shù)為 0.
printf "Hi %s, your room number is %d. \\n" Abhishek Prakash 131
bash: printf: Prakash: invalid number
Hi Abhishek, your room number is 0.
Hi 131, your room number is 0.
上面代碼中,Abhishek Prakash 會(huì)被用于第一個(gè)參數(shù),131 會(huì)被用于第二個(gè)參數(shù)。
當(dāng)它找到一個(gè)字符串(Prakash)而不是整數(shù)時(shí),就會(huì)報(bào)錯(cuò),但它會(huì)繼續(xù)顯示第二個(gè)參數(shù)為默認(rèn)值0的輸出。
類似地,它將131視為第二組參數(shù)中的字符串,由于第二個(gè)參數(shù)不存在,因此它默認(rèn)為0。
規(guī)范格式字符
有幾個(gè)格式說明符可用于以所需格式顯示輸出。 以下是一些最常見的:
字符 | 用途 |
---|---|
%s | 字符串 |
%c | 單個(gè)字符 |
%d | 整數(shù) |
%o | 八進(jìn)制整數(shù) |
%x | 十六進(jìn)制整數(shù) |
%f | 浮點(diǎn) |
%b | 帶反斜杠轉(zhuǎn)義字符的字符串 |
%% | 百分號(hào) |
一些例子
下面是一些比較簡(jiǎn)單的例子,通過命令就可以看出它的用法。
$ printf "The octal value of %d is %o\\n" 30 30
The octal value of 30 is 36
讓我們看看使用 %b 說明符來正確解釋反斜杠轉(zhuǎn)義字符。
$ printf "String with backslash: %s\\n" "Hello\\nWorld!"
String with backslash: Hello\\nWorld!
上面例子中 %s 正常使用,這個(gè)沒有什么好解釋的,但是參數(shù)中的 \\n 換行符卻沒有起作用。 這時(shí)候,需要用到 %b:
$ printf "String with backslash: %b\\n" "Hello\\nWorld!"
String with backslash: Hello
World!
當(dāng)使用 %c 時(shí),它一次只讀取一個(gè)字符:
$ printf "Character: %c\\n" a
Character: a
$ printf "Character: %c\\n" a b c
Character: a
Character: b
Character: c
$ printf "Character: %c\\n" abc
Character: a
使用修飾符以特定樣式顯示 printf 輸出
有一些字符可以用于根據(jù)你的喜好來設(shè)置輸出的樣式。
# 用于顯示八進(jìn)制和十六進(jìn)制數(shù)字
早些時(shí)候,我們使用過 %o 將十進(jìn)制轉(zhuǎn)為八進(jìn)制,但是輸出卻不能很清楚的看出來這是一個(gè)八進(jìn)制,所以現(xiàn)在我們使用修飾符 # 來正確的顯示八進(jìn)制和十六進(jìn)制的數(shù)字。
$ printf "%d is %#o in octal and %#x in hexadecimal\\n" 30 30 30
30 is 036 in octal and 0x1e in hexadecimal
正整數(shù)的空格修飾符
可以在 % 和 d 之間加一個(gè)空格來顯示帶前導(dǎo)空格的正整數(shù),當(dāng)有正數(shù)和負(fù)數(shù)時(shí),這樣顯示會(huì)更規(guī)范,如下所示:
$ printf "%d \\n%d \\n%d \\n" 10 -10 10
10
-10
10
$ printf "% d \\n%d \\n% d \\n" 10 -10 10
10
-10
10
寬度修改器
寬度修飾符是一個(gè)整數(shù),用于指定參數(shù)的最小字段寬度。
默認(rèn)情況下,它是右對(duì)齊的:
$ printf "%10s| %5d\\n" Age 23
Age| 23
可以使用中劃線 - 來讓其左對(duì)齊:
$ printf "%-10s| %-5d\\n" Age 23
Age | 23
設(shè)置精度
可以使用一個(gè)點(diǎn) . 來指定 %d、%u、%o、%x 顯示的最小位數(shù),不足位的左側(cè)以 0 補(bǔ)充。 如下所示:
$ printf "Roll Number: %.5d\\n" 23
Roll Number: 00023
如果對(duì)字符串使用精度修飾符,它會(huì)指定字符串的最大長(zhǎng)度。 如果字符串較長(zhǎng),則會(huì)在顯示中被截?cái)唷?/p>
$ printf "Name: %.4s\\n" Abhishek
Name: Abhi
還可以組合寬度和精度修改器:
$ printf "Name: %.4s\\n" Abhishek
Name: Abhi
$ printf "Name: %10.4s\\n" Abhishek
Name: Abhi
以表格格式顯示輸出
下面我們看一個(gè)稍微復(fù)雜一點(diǎn)的例子,在 bash 中使用 printf 命令打印如下表格:
名字 | 身份證 | 年齡 | 成績(jī) |
---|---|---|---|
福爾摩斯 | 0000122 | 23 | 一個(gè) |
詹姆斯·邦德 | 0000007 | 27 | F |
赫拉克勒斯·波洛 | 0006811 | 59 | G |
簡(jiǎn)·馬普爾 | 1234567 | 71 | C |
下面是我編寫的腳本,大家根據(jù)各自情況可以嘗試一下:
#/bin/bash
seperator=--------------------
seperator=$seperator$seperator
rows="%-15s| %.7d| %3d| %c\\n"
TableWidth=37
printf "%-15s| %-7s| %.3s| %s\\n" Name ID Age Grades
printf "%.${TableWidth}s\\n" "$seperator"
printf "$rows" "Sherlock Holmes" 122 23 A
printf "$rows" "James Bond" 7 27 F
printf "$rows" "Hercules Poirot" 6811 59 G
printf "$rows" "Jane Marple" 1234567 71 C
運(yùn)行,其輸出如下:
-
Linux
+關(guān)注
關(guān)注
87文章
11465瀏覽量
212825 -
命令
+關(guān)注
關(guān)注
5文章
730瀏覽量
22678 -
C++
+關(guān)注
關(guān)注
22文章
2117瀏覽量
74790 -
Bash
+關(guān)注
關(guān)注
0文章
57瀏覽量
10398 -
Printf
+關(guān)注
關(guān)注
0文章
84瀏覽量
14099
發(fā)布評(píng)論請(qǐng)先 登錄
bash腳本中的test命令詳解

Linux Shell系列教程之Shell printf命令詳解
Linux bash命令
Linux之bash的主要介紹
Linux啟動(dòng)過程詳解
Linux關(guān)機(jī)命令詳解
Linux系統(tǒng)命令及其使用詳解 _120頁
Linux 中自定義 Bash 命令提示符
Linux操作系統(tǒng)基礎(chǔ)命令:如何運(yùn)用Bash history
BASH shell腳本篇—條件命令

評(píng)論