printf コマンド

目的

フォーマットされた出力を書き出します。

構文

printf FormatArgument ... ]

説明

printf コマンドは、Argument パラメーターを変換してフォーマットし、標準出力へ書き出します。Argument パラメーターは Format パラメーターの制御下でフォーマットされます。 フォーマットされた出力行の長さは、LINE_MAX バイトを超えることはできません。

以下の環境変数が、printf コマンドの実行に影響します。

項目 説明
LANG LC_ALL および対応する環境変数 (LC_ で始まる変数) の両方にロケールが指定されていない場合、ロケール・カテゴリーに使用するロケールを決定します。
LC_ALL LANG やそのほかの LC_ 環境変数の設定で指定されたロケール・カテゴリーの値を上書きするために使用するロケールを決定します。
LC_CTYPE テキスト・データのバイト・シーケンスを文字として解釈するためのロケールを決定します。例えば、パラメーター中の単一バイト対マルチバイト文字です。
LC_MESSAGES メッセージを書き出す際の言語を決めます。
LC_NUMERIC 数値フォーマット設定のロケールを決定します。この環境変数は、e、E、f、g、 および G 変換文字を使用して書き出される数字のフォーマットに影響します。
Format パラメーターは、以下の 3 種類のオブジェクトを含む文字列です。
  • 出力ストリームへコピーする非暗号文字。
  • 変換指定。各変換指定では 0 またはそれ以上のエントリーが値パラメーター・リストから検索されるようにします。
  • 以下のようなエスケープ・シーケンス。出力ストリームへコピーされるとき、これらのシーケンスによって、 関連するアクションがそのアクションを行えるデバイスに表示されます。
    項目 説明
    ¥¥ 円記号
    ¥a アラート
    ¥b バックスペース
    ¥f 用紙送り
    ¥n 改行
    ¥r 復帰
    ¥t タブ
    ¥v 垂直タブ
    ¥ddd ddd は 1 桁、2 桁、または 3 桁の 8 進数。これらのエスケープ・シーケンスは、8 進数で指定した数値を持つバイトとして表示されます。

Argument パラメーターは、Format パラメーターの制御下で標準出力へ書き出される 1 文字列または複数文字列のリストです。

Format パラメーターは、Argument パラメーターを満たすのに必要な回数だけ繰り返し使用されます。余分な c または s 変換指定はどれも、null 文字列 Argument が提供されたときと同じように評価されます。その他の余分な変換指定は、0 Argument が提供されたときと同じように評価されます。Format パラメーターに変換指定がなく、Argument パラメーターが存在している場合は、その結果は不定になります。

Format パラメーターでの各変換指定の構文および指定順序は以下のとおりです。
  1. A % (パーセント記号)。
  2. オプションなし、または 1 つ以上のオプションで、変換指定の意味を変更します。オプションの文字と意味は、以下のとおりです。
    項目 説明
    - 変換の結果は、フィールド内に左詰めされます。
    + 符号付き変換の結果は、常に記号 (+ または -) で始まります。
    blank 符号付き変換の最初の文字が記号でない場合、結果の前にブランクが入ります。ブランクと + の両方のオプション文字が表示されたときには、ブランクのオプション文字が無視されます。
    # このオプションでは、値が代替フォーマットに変換されるように指定します。 cdiu、 および s 変換の場合、 このオプションは何の効果も与えません。 o 変換の場合、結果の最初の数字が強制的に 0 (ゼロ) になるように精度が高められます。x および X 変換の場合、ゼロ以外の値の結果にはそれぞれその前に 0x、または 0X が付きます。 eEfg、 および G 変換の場合、 基数文字の後に数値が続かない場合でも、結果には常に基数文字が含まれます。g および G 変換の場合、通常の場合と同様に、後続のゼロが結果から除去されることはありません。
    0 diouxeEfg、 および G 変換の場合、 先頭にゼロ (符号または基数の指示に続くゼロ) を付けることによって フィールド幅の埋め込みが行われ、スペースでの埋め込みは実行されません。0 (ゼロ) および - (負符号) オプションが表示された 場合、0 (ゼロ) オプションは無視されます。dioux、および X 変換の場合、精度が指定されていれば 0 (ゼロ) オプションは無視されます。
    注: その他の変換の場合、動作は不定になります。
  3. 最小のフィールド幅を指定するオプションの 10 進数文字列。変換された値の文字数がフィールド幅より少ない場合、 フィールド幅で指定された長さになるようにフィールドの左側が埋め込まれます。 左調整のオプションを指定している場合には、フィールドの右側が埋め込まれます。 変換結果の文字数がフィールド幅より長い場合には、フィールドが拡張されて、 変換された結果が入るようにします。 切り捨ては行われません。ただし、精度が高い場合、右側の切り捨てが行われることがあります。
  4. オプションの精度。この精度は 10 進数の文字列の後の . (ドット) です。 精度を指定しない場合には、0 (ゼロ) として扱われます。精度によって以下のものが指定されます。
    • doiux、または X 変換について表示される最小桁数。
    • e および f 変換について、基数文字の後に表示される桁数。
    • g 変換の最大有効桁数。
    • s 変換で文字列から表示する最大バイト数。
  5. 適用する変換のタイプを示す文字。以下に例を示します。
    項目 説明
    % 変換を行いません。% (パーセント記号) を表示します。
    a, A これは、浮動小数点値を受け入れ、値をフォーマット [-]0xh.hhhhd の 10 進表記に変換します。 10 進表記には、小数点の前に 1 桁の 16 進数字が含まれます。 この 16 進数字は、指定された浮動小数点値が、正規化された浮動小数点値であるか、または浮動小数点値が指定されていない場合は、ゼロ以外の値でなければなりません。 小数点以下の 16 進数字の数は精度値を示します。 この精度値が Format パラメーターで指定されていない場合に、FLT_RADIX 引数の指数値が 2 であると、精度値は浮動小数点値を表します。 精度値が指定されていない場合に、FLT_RADIX 引数の指数値が 2 でなければ、a, A 変換指定子で使用される内部表現フォーマットで異なる浮動小数点値を精度値で区別できます。 10 進表記における後続ゼロは削除してかまいません。 精度値が 0 であり # フラグが指定されていない場合、小数点は表示されません。 文字列 abcdefa 変換指定子に使用され、文字列 ABCDEFA 変換指定子に使用されます。 A 変換指定子は、文字 x や p ではなく文字 X および P の数字を提供します。 10 進の指数 2 を表すには、FLT_RADIX 引数の指数に、1 桁から必要桁数までの数字を含める必要があります。 浮動小数点値がゼロの場合は、指数値もゼロです。 無限大データ型または NaN データ型を表す浮動小数点値は、f, F 変換指定子のフォーマットに変換されます。
    d, i 整数値を受け取り、それを符号付き 10 進表記に変換します。精度は、表示する最小桁数を指定します。 変換対象の値をそれより少ない桁数で表現できる場合には、値の先頭にゼロが付けられて拡張されます。 デフォルトの精度は 1 です。ゼロ値をゼロの精度で変換した結果は、null 文字列です。 ゼロを先行文字としてフィールド幅を指定すると、 フィールド幅の値になるように先頭にゼロが埋め込まれます。
    o 整数値を受け取り、それを符号付き 8 進表記に変換します。精度は、表示する最小桁数を指定します。 変換対象の値をそれより少ない桁数で表現できる場合には、値の先頭にゼロが付けられて拡張されます。 デフォルトの精度は 1 です。ゼロ値をゼロの精度で変換した結果は、null 文字列です。 ゼロを先行文字としてフィールド幅を指定すると、 フィールド幅の値になるように先頭にゼロが埋め込まれます。フィールド幅の 8 進数値は暗黙指定されません。
    u 整数値を受け取り、それを符号なし 10 進表記に変換します。精度は、表示する最小桁数を指定します。 変換対象の値をそれより少ない桁数で表現できる場合には、値の先頭にゼロが付けられて拡張されます。 デフォルトの精度は 1 です。ゼロ値をゼロの精度で変換した結果は、null 文字列です。 ゼロを先行文字としてフィールド幅を指定すると、 フィールド幅の値になるように先頭にゼロが埋め込まれます。
    x, X 整数値を受け取り、それを 16 進表記に変換します。x 変換には文字 abcdef が、X 変換には文字 ABCDEF が使用されます。精度は、表示する最小桁数を指定します。 精度は、表示する最小桁数を指定します。 変換対象の値をそれより少ない桁数で表現できる場合には、値の先頭にゼロが付けられて拡張されます。 デフォルトの精度は 1 です。ゼロ値をゼロの精度で変換した結果は、null 文字列です。 ゼロを先行文字としてフィールド幅を指定すると、 フィールド幅の値になるように先頭にゼロが埋め込まれます。
    f, F これは、浮動小数点値を受け入れ、値をフォーマット [-]ddd.ddd の 10 進表記に変換します。 基数文字または小数点の後の桁数は、指定の精度値と同じです。 LC_NUMERIC ロケール・カテゴリーは、このフォーマットで使用されなければならない基数文字を決定します。 精度値が浮動小数点値から削除されると、出力において基数文字の後に 6 桁の数字が追加されます。 精度値が 0 (ゼロ) の場合、基数文字は表示されません。 無限大データ型を表す浮動小数点値は、フォーマット [-]inf または [-]infinity に変換されます。 フォーマット [-]inf[-]infinity は実装環境に依存します。 NaN データ型を表す浮動小数点値は、フォーマット [-]nan (n-char-sequence) または [-]nan に変換されます。 n-char-sequence の意味は実装環境に依存します。 F 変換指定子は、フォーマット infinfinitynan ではなく、INFINFINITY、または NAN を提供します。
    e, E 浮動小数点値または倍精度値を受け取り、それを指数フォーマット [-] d.dde{+|-}dd に変換します。基数文字 (ここでは小数点として示される) の前には 1 桁あり、基数文字の後の桁数は精度指定と同じです。LC_NUMERIC ロケール・カテゴリーは、このフォーマットで使用する基数文字を決定します。精度を指定しない場合には、6 桁が出力されます。 精度が 0 (ゼロ) の場合は、 基数文字は表示されません。 E 変換文字は、指数の前に e ではなく E を付けた数字を置きます。指数には少なくとも 2 桁が必ず含まれます。ただし、表示される値が 2 桁を超える指数を必要とする場合には、 付加指数桁が必要に応じて表示されます。
    g, G 浮動小数点値または倍精度値を受け取り、有効な桁数を指定する精度でそれを f または e 変換文字 (G 変換の場合には E) のスタイルに変換します。後ろのゼロは、結果から取り除かれます。 基数文字は、その後ろに数字が続く場合のみ表示されます。 使用されるスタイルは、変換される値によって左右されます。スタイル g の結果が出されるのは、変換から生じた指数が -4 より小さい場合か、または精度以上である場合に限られます。
    c 値を文字列として受け取り、その文字列の最初の文字を表示します。
    s 値を文字列として受け取り、文字列の終わりに達するまでか、または精度によって示された文字数に達するまで、文字列から文字を表示します。精度を指定しない場合には、最初の null 文字までのすべての文字が表示されます。
    b 値を円記号エスケープ・シーケンスを含む可能性のある文字列として受け取ります。文字列の最後に達するまで、あるいは精度指定によって示されたバイト数に達するまで、 変換された文字列からのバイトが表示されます。 精度を省略した場合には、最初の null 文字までのすべてのバイトが表示されます。

以下の円記号エスケープ・シーケンスがサポートされます。

  • 前述の Format パラメーターの説明にリストされているエスケープ・シーケンス。各エスケープ・シーケンスは、それが表現する個々の文字に変換されます。
  • ¥c (円記号 c) シーケンス。これは表示されず、それを含む文字列パラメーター内の残りの文字、残りの文字列パラメーター、および Format パラメーターの付加文字を、printf が無視するようにします。

終了状況

このコマンドは、以下の終了値を戻します。

項目 説明
0 正常終了。
>0 エラーが発生しました。

  1. 以下のコマンドを入力します。
    printf "%5d%4d¥n" 1 21 321 4321 54321
    以下の出力が作成されます。
        1  21
      3214321
    54321   0
    指定した文字列すべてを表示するために、Format パラメーターが 3 回使用されています。最後の %4d 変換指定を満たすために、printf コマンドによって 0 (ゼロ) が出力されます。
  2. 以下のコマンドを入力します。
    printf "%c %c¥n" 78 79
    以下の出力が作成されます。
    7 7
  3. 以下の例は、%$ フォーマット指定子をどのように使用すれば 引数の順序とは異なる順序で日付を印刷できるかを示します。
    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 コマンドが入っています。