Linux命令 printf - 格式化并輸出結(jié)果

2022-03-16 17:23 更新

printf

格式化并輸出結(jié)果。

內(nèi)建命令

概要

printf [-v var] format [arguments]

主要用途

  • 格式化參數(shù)并輸出。

選項(xiàng)

-v var:將結(jié)果輸出到變量var中而不是輸出到標(biāo)準(zhǔn)輸出。

參數(shù)

format:輸出格式。

arguments:一到多個(gè)參數(shù)。

轉(zhuǎn)義序列:除了支持printf(1)和printf(3)的轉(zhuǎn)義序列,內(nèi)建printf還支持以下轉(zhuǎn)義序列:

%b       展開(kāi)參數(shù)中的反斜杠轉(zhuǎn)義字符。
%q       將參數(shù)擴(kuò)起以用作shell輸入。
%(fmt)T  根據(jù)strftime(3)中的轉(zhuǎn)義字符來(lái)輸出日期時(shí)間字符串。

返回值

返回狀態(tài)為成功除非給出了非法選項(xiàng)、寫錯(cuò)誤、賦值錯(cuò)誤。

例子

# %-5s 格式為左對(duì)齊且寬度為5的字符串代替('-'表示左對(duì)齊),不使用則默認(rèn)右對(duì)齊。
# %-4.2f 格式為左對(duì)齊寬度為4,保留兩位小數(shù)。

printf "%-5s %-10s %-4s\n" NO Name Mark
printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323

# 輸出
NO    Name       Mark
01    Tom        90.35
02    Jack       89.23
03    Jeff       98.43


# %b %q %(fmt)T 的例子。
# see it again with a newline.
printf "%s\n" 'hello world'
# 展開(kāi)換行符,和上面的結(jié)果一樣。
printf "%b" 'hello world\n'

printf '%q\n' 'a b c'
# 輸出
a\ b\ c

# %z為時(shí)區(qū),%n為換行符。
printf "%(%F %T %z%n)T"
# 輸出
2019-09-10 01:48:07 +0000

注意

  1. 該命令是bash內(nèi)建命令,相關(guān)的幫助信息請(qǐng)查看help命令。

外部命令

概要

printf FORMAT [ARGUMENT]...
printf OPTION

主要用途

  • 格式化參數(shù)并輸出。

選項(xiàng)

--help 顯示幫助信息并退出。
--version 顯示版本信息并退出。

參數(shù)

format:輸出格式。

arguments:一到多個(gè)參數(shù)。

在這里忽略了(%b %q),如果你安裝的coreutils版本支持它們,那么請(qǐng)參考上面的例子。
支持的轉(zhuǎn)義序列:

\"          雙引號(hào)
\\          反斜杠
\a          響鈴
\b          退格
\c          截?cái)噍敵?\e          退出
\f          翻頁(yè)
\n          換行
\r          回車
\t          水平制表符
\v          豎直制表符
\NNN        八進(jìn)制數(shù) (1到3位數(shù)字)
\xHH        十六進(jìn)制數(shù) (1到2位數(shù)字)
\uHHHH      Unicode字符附加4位十六進(jìn)制數(shù)字
\UHHHHHHHH  Unicode字符附加8位十六進(jìn)制數(shù)字
%%          百分號(hào)

以及'diouxXfeEgGcs'中的一個(gè)結(jié)尾的C格式規(guī)范,將被轉(zhuǎn)換為正確的類型并處理可變寬度。

例子

# 使用 /usr/bin/printf 確保調(diào)用的不是內(nèi)建命令。
# 當(dāng)然,在你關(guān)閉內(nèi)建printf以及確認(rèn)當(dāng)前環(huán)境沒(méi)有printf函數(shù)的情況下,可直接使用printf,詳見(jiàn)末尾"注意"的鏈接。

# 按行打印數(shù)組和關(guān)聯(lián)數(shù)組的下標(biāo)及值。

# 聲明數(shù)組可以不加'declare -a'或'local -a'(在函數(shù)內(nèi)聲明的局部變量)。
arr=('line1' 'line2')
/usr/bin/printf "%s\n" ${!arr[@]}
# 輸出下標(biāo)
0
1
/usr/bin/printf "%s\n" ${arr[@]}
# 輸出值
line1
line2

#聲明關(guān)聯(lián)數(shù)組(也就是字典)必須加'declare -A'或'local -A'(在函數(shù)內(nèi)聲明的局部變量)。
declare -A assoc_arr=(['key1']='value1' ['key2']='value2')
/usr/bin/printf "%s\n" ${!assoc_arr[@]}
# 輸出鍵。
key2
key1
/usr/bin/printf "%s\n" ${assoc_arr[@]}
# 輸出值。
value2
value1

返回值

返回狀態(tài)為成功除非給出了非法選項(xiàng)等。

注意

  1. 該命令是GNU coreutils包中的命令,相關(guān)的幫助信息請(qǐng)查看man -s 1 printf或info coreutils 'pwd invocation'。
  2. 啟動(dòng)或關(guān)閉內(nèi)建命令請(qǐng)查看enable命令,關(guān)于同名優(yōu)先級(jí)的問(wèn)題請(qǐng)查看builtin命令的例子部分的相關(guān)討論。
  3. 我通過(guò)和bug-bash@gnu.org的交流,得到了關(guān)于這幾個(gè)格式說(shuō)明符%b %q %(fmt)T的解釋:printf(1)中的%b格式說(shuō)明符是printf(3)支持的格式之外增加的一個(gè)POSIX特性。%q和%T說(shuō)明符是非標(biāo)準(zhǔn)的,并且不受所有獨(dú)立實(shí)現(xiàn)的printf的支持。更多細(xì)節(jié)請(qǐng)參考鏈接:POSIX printf APPLICATION USAGE段落的第五節(jié)。POSIX printf格式說(shuō)明符 的Description段落。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)