printf 指令
用途
寫入格式化輸出。
語法
printf 格式 [ 引數 ... ]
說明
printf 指令會將其 引數 參數轉換、格式化及寫入標準輸出。 引數 參數在 格式 參數的控制下格式化。 格式化輸出行的長度不能超過 LINE_MAX 個位元組。
下列環境變數會影響 printf 指令的執行:
項目 | 說明 |
---|---|
LANG | 當 全部 LC_ALL 及對應的環境變數 (從 LC_開始) 未指定語言環境時,決定要用於語言環境種類的語言環境。 |
LC_ALL | 決定語言環境,用來置換 LANG 或任何其他 LC_ 環境變數設定所指定語言環境種類的任何值。 |
LC_CTYPE | 決定將文字資料的位元組序列解譯成字元的語言環境; 例如,參數中的單位元組與多位元組字元。 |
LC_MESSAGES | 決定撰寫訊息的語言。 |
LC_NUMERIC | 決定數值格式化的語言環境。 此環境變數會影響使用 e、E、f、g、 及 G 轉換字元寫入的數字格式。 |
格式 參數是包含三種物件類型的字串:
- 複製到輸出串流的純文字字元。
- 轉換規格,每一個都會導致從值參數清單中擷取 0 個以上項目。
- 下列 ESC 序列。 當複製到輸出串流時,這些序列會導致它們的關聯動作顯示在能夠執行動作的裝置上:
項目 說明 \\ 反斜線 \a 警示 \b 倒退鍵 \f 換頁 \n 新建線路 \r 換行 (carriage return) \t 標籤 \v 垂直標籤 \ddd 其中 ddd 是一、二或三位數的八進位數字。 這些 ESC 序列會顯示為具有八進位數字所指定數值的位元組。
引數 參數是要在 格式 參數控制下寫入標準輸出的一或多個字串清單。
格式 參數會經常重複使用,以滿足 引數 參數。 任何額外的 c 或 s 轉換規格都會如同提供空字串 引數 一樣評估; 其他額外的轉換規格則如同提供 0 引數 一樣評估。 如果 格式 參數未包含任何轉換規格,且 引數 參數存在,則未指定結果。
格式 參數中的每一個轉換規格都依下列順序具有下列語法:
- A % (百分比符號)。
- 零或多個選項,可修改轉換規格的意義。 選項字元及其意義如下:
項目 說明 - 轉換的結果會在欄位內向左對齊。 + 帶正負號的轉換結果一律以符號 (+ 或-) 開頭。 空白 如果已簽署轉換的第一個字元不是符號,則結果會以空白作為字首。 如果同時顯示空白及 + 選項字元,則會忽略空白選項字元。 # 此選項指定將值轉換成替代格式。 對於 c、 日、 我、 u及 s 轉換,此選項沒有作用。 對於 o 轉換,它會增加精準度,以強制結果的第一個數字為 0 (零)。 對於 x 和 X 轉換,非零結果會分別有 0x或 0X 字首。 對於 E、 E、 f、 g和 G 轉換,結果一律包含基數字元,即使基數字元後面沒有數字。 對於 g 和 G 轉換,通常不會從結果中移除尾端零。 0 對於 日、 我、 o、 u、 x、 E、 E、 f、 g和 G 轉換,會使用前導零 (遵循任何符號或基底指示) 來填補欄位寬度,而不執行空格填補。 如果顯示 0 (零) 和 - (減號) 選項,則會忽略 0 (零) 選項。 對於 日、 我、 o、 u、 x及 X 轉換,如果指定精準度,則會忽略 0 (零) 選項。 附註: 對於其他轉換,未定義行為。 - 指定欄位寬度下限的選用十進位數字字串。 如果轉換值的字元數少於欄位寬度,則會將欄位在左側填補至欄位寬度指定的長度。 如果指定向左調整選項,則會在右側填補欄位。 如果轉換的結果比欄位寬度寬,則會展開欄位以包含轉換的結果。 不會發生截斷。 不過,小精準度可能會導致右側截斷。
- 選用精準度。 精準度是。 (點) 後接十進位數字串。 如果未提供精準度,則會將它視為 0 (零)。 精準度指定:
- 指出要套用的轉換類型的字元,例如:
項目 說明 % 不執行轉換。 列印% (百分比符號)。 A, A 接受浮點值,並將值轉換為格式為 [-]0xh.hhhhp±d
的十進位表示法。 十進位表示法在小數點之前包含一個十六進位數字。 如果指定的浮點值是正規化浮點值或未指定,則此十六進位數字必須是非零值。 小數點後的十六進位數字表示精準度值。 如果未使用 格式 參數指定精準度值,且 FLT_RADIX 引數的指數值為 2 ,則精準度值代表浮點值。 如果未指定精準度值,且 FLT_RADIX 引數的指數值不是 2 ,則精準度值可以在 a、 A 轉換指定元所使用的內部表示法格式中區分不同的浮點值。 可以移除十進位表示法中的尾端零。 如果精準度值為零,且未指定 # 旗標,則不會顯示小數點。 字母abcdef
用於 轉換指定元,而字母ABCDEF
用於 A 轉換指定元。 A 轉換指定元提供具有字元 X 和 P 的數字,而非字元 x 和 p。 為了代表 2 的十進位指數, FLT_RADIX 引數的指數必須包含一個位數到所需數目的位數。 如果浮點值為零,則指數值也是零。 代表無限或 NaN 資料類型的浮點數值會轉換為 f、 F 轉換指定元的格式。日, 我 接受整數值,並將它轉換成帶正負號的十進位表示法。 精準度指定要顯示的位數下限。 如果要轉換的值可以用較少的數字來表示,則會以前導零來展開。 預設精準度為 1。 轉換精準度為零的零值的結果是空字串。 指定以零作為前導字元的欄位寬度會導致欄位寬度值以前導零填補。 o 接受整數值並將其轉換為帶正負號的八進位表示法。 精準度指定要顯示的位數下限。 如果要轉換的值可以用較少的數字來表示,則會以前導零來展開。 預設精準度為 1。 轉換精準度為零的零值的結果是空字串。 指定以零作為前導字元的欄位寬度會導致欄位寬度值以前導零填補。 欄位寬度的八進位值不是隱含的。 u 接受整數值並將其轉換為不帶正負號的十進位表示法。 精準度指定要顯示的位數下限。 如果要轉換的值可以用較少的數字來表示,則會以前導零來展開。 預設精準度為 1。 轉換精準度為零的零值的結果是空字串。 指定以零作為前導字元的欄位寬度會導致欄位寬度值以前導零填補。 x, X 接受整數值並將其轉換為十六進位表示法。 字母 abcdef 用於 x 轉換,字母 ABCDEF 用於 X 轉換。 精準度指定要顯示的位數下限。 如果要轉換的值可以用較少的數字來表示,則會以前導零來展開。 預設精準度為 1。 轉換精準度為零的零值的結果是空字串。 指定以零作為前導字元的欄位寬度會導致欄位寬度值以前導零填補。 f, F 接受浮點數值,並以 [-] ddd.ddd
格式將其轉換為十進位表示法。 基數字元或小數點之後的位數等於指定的精準度值。 LC_NUMERIC 語言環境種類決定必須以此格式使用的基數字元。 如果從浮點數值中移除精準度值,則會在輸出中的基數字元之後加上六個數字。 如果精準度值為 0 (零) ,則不會顯示基數字元。 代表無限資料類型的浮點數值會轉換為格式[-]inf
或[-]infinity
。 格式[-]inf
或[-]infinity
與實作相關。 代表 NaN 資料類型的浮點值會轉換為格式[-]nan
(n-char-sequence) 或[-]nan
。 任何 n-char-sequence 的意義取決於實作。 F 轉換指定元提供格式INF
、INFINITY
或NAN
,而不是inf
、infinity
或nan
。E, E 接受浮點或倍精準度值,並將其轉換為指數形式 [-] d。dde{+|-}dd。 基數字元之前有一個數字 (在這裡顯示為小數點) ,基數字元之後的位數等於精準度規格。 LC_NUMERIC 語言環境種類決定要在此格式中使用的基數字元。 如果未指定精準度,則會輸出六位數。 如果精準度為 0 (零) ,則不會顯示基數字元。 E 轉換字元會在指數之前產生 E 而非 e 的數字。 指數一律至少包含兩位數。 不過,如果要列印的值需要大於兩位數的指數,則會依需要列印其他指數位數。 g, G 接受浮點或倍精準度值,並以 f 或 E 轉換字元 (或 E (若為 G 轉換)) 的樣式進行轉換,並具有指定有效位數的精準度。 從結果中移除尾端零。 只有在基數字元後面接著數字時,才會顯示基數字元。 使用的樣式取決於轉換的值。 只有在轉換產生的指數小於 -4 或大於或等於精準度時,才會產生樣式 g 。 C 接受字串形式的值,並列印字串中的第一個字元。 s 接受字串形式的值,並列印字串中的字元,直到發現字串結尾或達到精準度所指示的字元數為止。 如果未指定精準度,則會列印直到第一個空值字元為止的所有字元。 B 接受字串形式的值,可能包含反斜線-ESC 序列。 會列印已轉換字串中的位元組,直到達到字串結尾或精準度規格所指示的位元組數為止。 如果省略精準度,則會列印所有位元組,直到第一個空值字元為止。
支援下列反斜線 ESC 序列:
- 先前在 格式 參數說明下列出的 ESC 序列。 這些會轉換成它們所代表的個別字元。
- 未顯示的 \c (反斜線 c) 序列,會導致 printf 指令忽略包含它的字串參數中的任何剩餘字元、任何剩餘字串參數,以及 格式 參數中的任何其他字元。
結束狀態
這個指令會傳回下列結束值:
項目 | 說明 |
---|---|
0 | 順利完成。 |
>0 | 發生一個錯誤。 |
範例
- 輸入下列指令:
這會產生下列輸出:printf "%5d%4d\n" 1 21 321 4321 54321
格式 參數使用三次來列印所有給定的字串。 0 (零) 由 printf 指令提供,以滿足最後一個%4d轉換規格。1 21 3214321 54321 0
- 輸入下列指令:
這會產生下列輸出:printf "%c %c\n" 78 79
7 7
- 下列範例示範如何使用 %$ 格式指定元,以不同於引數順序的順序來列印日期:
printf (""%1$s, %3$d. %2$s, %4$d:%5$.2d", weekday, month, day, hour, min); Sunday, 3. July, 10:02 (weekday, day. month, hour:min)
檔案
項目 | 說明 |
---|---|
/usr/bin/printf | 包含 printf 指令。 |