Printf 組込みコマンドはオペランドを整形して出力します。
printf 書式 [値…]
Printf コマンドはオペランドで指定した書式に従って値を整形し、標準出力に出力します。Echo コマンドとは異なり、出力の最後には自動的に改行は付きません。
書式の指定の仕方は C 言語の printf 関数とよく似ています。書式の中では %
で始まる変換指定と \
で始まるエスケープシーケンスを使用できます。書式に含まれる変換指定とエスケープ以外の文字はそのまま出力します。
%%
以外の変換指定は、対応する値をとります。変換指定は、値を特定の形式に整形して出力します。変換指定と値は与えられた順番に対応付けられます。値が余った場合は、全ての値を処理し終わるまで書式の整形・出力を繰り返します。値が足りない場合は、空文字列 (文字列に関する変換指定の場合) または 0 (数値に関する変換指定の場合) を仮定します。値が一つも与えられていない場合は、書式は一度だけ出力されます。
利用可能な変換指定は以下の通りです。
%d
または %i
%u
%o
%x
%X
%f
%F
%e
%E
%g
%f
と %e
のどちらかの形式で出力します。
%G
%F
と %E
のどちらかの形式で出力します。
%c
%s
%b
%%
%
) を出力します。
%%
以外の変換指定では、最初の %
の直後に変換指定フラグ・フィールド幅・精度をこの順で指定できます。これらを指定することで出力の形式を細かく調整できます。
指定できる変換指定フラグは以下の通りです。フラグを複数指定しても構いません。
-
)
+
)
)
#
%o
の場合、出力する八進数の先頭に必ず一桁以上の 0 が付くように、必要に応じて 0 を付加します。
%x
(または %X
) の場合、値が 0 でなければ数値の先頭に 0x
(または 0X
) を付加します。
%e
, %E
, %f
, %F
, %g
, %G
の場合、小数点の後に数字がない場合でも小数点を省略しないようにします。また変換指定が %g
, %G
の場合、小数点の後に 0 以外の数字がない場合でも 0 を省略しないようにします。
0
)
%d
, %i
, %u
, %o
, %x
, %X
, %e
, %E
, %f
, %F
, %g
, %G
の場合、出力が指定したフィールド幅いっぱいになるまで数値の先頭に 0 を付加します。
%d
, %i
, %u
, %o
, %x
, %X
で、精度が指定されている場合、このフラグは無視されます。
フィールド幅は、先頭に 0 の付かない十進整数の形で指定します。フィールド幅は出力の最低バイト数を指示します。出力のバイト数がフィールド幅に満たないときは、バイト数がフィールド幅に一致するまで空白文字を付加します。
精度は、ピリオド (.
) の直後に十進整数を置いたものの形で指定します。
%d
, %i
, %u
, %o
, %x
, %X
の場合、精度は出力の最低桁数を指示します。数値が最低桁数に満たない場合は最低桁数に達するまで先頭に 0 を付加します。精度が指定されていない場合、精度は 1 とみなします。
%e
, %E
, %f
, %F
の場合、精度は小数点以降の桁数を指示します。精度が指定されていない場合、精度は 6 とみなします。
%g
, %G
の場合、精度は数値の最大有効桁数を指示します。精度が指定されていない場合、精度は 6 とみなします。
%s
, %b
の場合、精度は出力する文字列の最大バイト数を指示します。精度が指定されていない場合、精度は無限大とみなします。
変換指定が %g
, %G
の場合の実際の形式は、指数部が -5 以下または精度以上ならば %e
, %E
、そうでなければ %f
, %F
となります。
最後に例を一つ挙げます。変換指定 %f
にゼロフラグを指定し、フィールド幅に 8、精度に 3 を指定する場合、最終的な変換指定は %08.3f
となります。この変換指定に対して値 12.34 を与えると、出力は 0012.340 となります。
書式の中で使えるエスケープシーケンスは以下の通りです。
\a
\b
\f
\n
\r
\t
\v
\\
\"
\'
\xxx
なし
3
という文字のコード番号が 51 ならば、printf '%d' '"3'
は 51 を出力します。
エラーがない限り printf コマンドの終了ステータスは 0 です。
POSIX では、マルチバイト文字の扱いについて厳密に定義していません。%s
変換指定で精度を指定した場合や、%c
変換指定を使用する場合、値にマルチバイト文字が含まれていると適切な出力が得られないかもしれません。Yash では、マルチバイト文字は全てワイド文字に変換してから処理するので、マルチバイト文字の一部のバイトだけが出力されるようなことはありません。