bash 中的格式化輸出命令:printf
在 Linux 命令行中最簡單的打印方法是使用 echo 命令:
然而,echo 命令不支持格式化輸出。要格式化輸出,可以使用 printf 命令,bash 中的 printf 與 c/c++ 中的printf 命令類似:
其輸出如下所示:
第一個參數 %s 接受一個字符串,第二個參數 %d 接受的是一個十進制整數,就跟 c/c++ 中的一樣。接下來我們展示一些 bash printf 命令的例子。
bash 中的 printf 命令
printf 命令的語法如下:
這里,format 是一個字符串,用于確定后續值的顯示方式。
在上面的例子中 printf "My brother %s is %d years old.\n" Prakash 21,前面的語句 "My brother %s is %d years old.\n" 是格式,后面的 Prakash 和 21 是參數,這些參數用于替換前面格式中的占位符 %s 和 %d。
在最簡單的方式中,printf 的使用跟 echo 類似:
注意到最后面的換行符 \n 了嗎?echo 和 printf 命令的區別在于,echo 命令會自動在末尾添加一個換行符,但是 printf 命令需要手動添加。
要特別注意參數的類型和數量
這里需要注意,格式化字符串通常會嘗試應用于所有參數。看下面的例子:?
同時,也需要盡量匹配格式化字符串中所期望的數據類型:
通過上面的例子可以看到,如果沒有找到匹配的參數,會使用默認值,默認字符串為 null,整數為 0.?
上面代碼中,Abhishek Prakash 會被用于第一個參數,131 會被用于第二個參數。
當它找到一個字符串(Prakash)而不是整數時,就會報錯,但它會繼續顯示第二個參數為默認值0的輸出。
類似地,它將131視為第二組參數中的字符串,由于第二個參數不存在,因此它默認為0。
規范格式字符
有幾個格式說明符可用于以所需格式顯示輸出。以下是一些最常見的:
字符 | 用途 |
%s | String |
%c | Single character |
%d | Integers |
%o | Octal integers |
%x | Hexadecimal integers |
%f | Floating point |
%b | String with backslash escape character |
%% | Percent sign |
一些例子
下面是一些比較簡單的例子,通過命令就可以看出它的用法。?
讓我們看看使用 %b 說明符來正確解釋反斜杠轉義字符。?
上面例子中 %s 正常使用,這個沒有什么好解釋的,但是參數中的 \n 換行符卻沒有起作用。這時候,需要用到 %b:
當使用 %c 時,它一次只讀取一個字符:
使用修飾符以特定樣式顯示 printf 輸出
有一些字符可以用于根據你的喜好來設置輸出的樣式。
# 用于顯示八進制和十六進制數字
早些時候,我們使用過 %o 將十進制轉為八進制,但是輸出卻不能很清楚的看出來這是一個八進制,所以現在我們使用修飾符 # 來正確的顯示八進制和十六進制的數字。?
正整數的空格修飾符
可以在 % 和 d 之間加一個空格來顯示帶前導空格的正整數,當有正數和負數時,這樣顯示會更規范,如下所示:?
寬度修改器
寬度修飾符是一個整數,用于指定參數的最小字段寬度。
默認情況下,它是右對齊的:?
可以使用中劃線 - 來讓其左對齊:
設置精度
可以使用一個點 . 來指定 %d、%u、%o、%x 顯示的最小位數,不足位的左側以 0 補充。如下所示:?
如果對字符串使用精度修飾符,它會指定字符串的最大長度。如果字符串較長,則會在顯示中被截斷。?
還可以組合寬度和精度修改器:
以表格格式顯示輸出
下面我們看一個稍微復雜一點的例子,在 bash 中使用 printf 命令打印如下表格:
Name | ID | Age | Grades |
Sherlock Holmes | 0000122 | 23 | A |
James Bond | 0000007 | 27 | F |
Hercules Poirot | 0006811 | 59 | G |
Jane Marple | 1234567 | 71 | C |
下面是我編寫的腳本,大家根據各自情況可以嘗試一下:?
運行,其輸出如下: