Go to main content

マニュアルページ セクション 1: ユーザーコマンド

印刷ビューの終了

更新: 2018年8月8日
 
 

printf(1)

名前

printf - 書式設定された出力の書き込み

形式

/usr/bin/printf

printf format [argument]...

ksh

printf format [string...]

説明

/usr/bin/printf

printf ユーティリティーは、出力書式を制御する format を使用して、各文字列オペランドを標準出力に書き込みます。

オペランド

/usr/bin/printf

/usr/bin/printf では次のオペランドがサポートされています。

format

残りのオペランドの書き込みに使用する書式を記述する文字列。format オペランドは、formats(7) マニュアルページに記載されている format 文字列として使用されますが、次の例外があります。

  • 形式文字列内のスペース文字は、変換指定のフラグ以外のどのコンテキストでも、出力にコピーされる通常の文字として扱われます。

  • 書式文字列の文字は文字として扱われ、SPACE 文字としては扱われません。

  • formats(7) マニュアルページに記載されているエスケープシーケンス (\\\a\b\f\n\r\t\v) のほかに、\ddd。ここで ddd は、8 進数によって指定される数値を持つバイトとして書き込まれる、1 桁、2 桁、または 3 桁の 8 進数です。

  • プログラムでは、format オペランドで指定されていない空白文字を d または u 変換仕様の出力の先頭や末尾に付けません。

  • プログラムでは、format オペランドで指定されていないゼロを o 変換仕様の出力の先頭に付けません。

  • 追加の変換文字 b は次のようにサポートされます。引数は、バックスラッシュエスケープシーケンスを含むことのできる文字列とみなされます。次のバックスラッシュエスケープシーケンスがサポートされています。

    • formats(7) マニュアルページに示されているエスケープシーケンス (\\, \a\b\f\n\r\t\v) は、それらが表す文字に変換されます

    • \0ddd。ここで、ddd は、8 進数の数値によって指定された数値を持つバイトに変換される、0 桁、1 桁、2 桁、または 3 桁の 8 進数です。

    • \c が記述されると、printf は、シーケンスを含む文字列オペランド内の残りの文字、残りの文字列オペランド、および format オペランドの追加の文字を無視します。

バックスラッシュの後に他の文字シーケンスが続く場合の解釈は、不確定です。

変換された文字列のバイトは、文字列の最後か、または精度の指定によって示されるバイト数に達するまで書き込まれます。精度を省略した場合は無限とみなされるため、変換された文字列の最後までのすべてのバイトが書き込まれます。引数を使用する各仕様について、次の引数オペランドが評価され、以下に指定されるような変換の適切なタイプに変換されます。format オペランドは、引数オペランドを満たすために必要に応じて再利用されます。追加の c または s の変換仕様は、NULL 文字列引数が指定された場合と同様に評価され、その他の追加の変換仕様は、ゼロ引数が指定された場合と同様に評価されます。format オペランドに変換仕様が含まれておらず、argument オペランドが存在する場合、結果は未定義です。format オペランド内の文字シーケンスが % 文字で始まるが、有効な変換仕様を形成していない場合、動作は未定義です。

argument

format の制御を受けて、標準出力に書き込まれる文字列。argument オペランドは、対応する変換文字が bc、または s の場合、文字列として処理されます。それ以外の場合は、ISO C 標準に記載されているように C の定数として評価され、次の拡張があります。

  • 先頭にプラス記号またはマイナス記号が許可されます。

  • 先頭文字が単一引用符または二重引用符の場合、値は、単一引用符または二重引用符に続く文字のベースとなるコードセット内の数値です。

引数オペランドを、対応する変換仕様に該当する内部の値に完全に変換できない場合、診断メッセージが標準エラーに書き込まれ、ユーティリティーは終了ステータス 0 で終了しませんが、残りのオペランドを引き続き処理し、エラーが検出された時点で蓄積された値を標準出力に書き込みます。

ksh

format オペランドは ANSI C/C99/XPG6 書式指定子を完全にサポートするほか、次の指定子もサポートします。

%b

文字列オペランド内の各文字は、次のように特別に処理されます。

\a

警告文字

\b

バックスペース文字

\c

復帰改行を付加せずに出力を終了します。残りの文字列オペランドは無視されます。

\E

エスケープ文字 (ASCII 8 進数 033)

\f

用紙送り文字

\n

復帰改行文字

\t

TAB 文字。

\v

垂直タブ文字

\\

バックスラッシュ文字

\0x

ASCII コードを 12、または 3 桁の 8 進数 x で表した 8 ビット文字。

%B

引数を変数名として処理し、文字列に変換しないで値を出力します。これは、–b のタイプを持つ変数にもっとも役立ちます。

%H

文字 <&>"、および非印字文字を持つ出力文字列で、HTML および XML ドキュメントで使用されるために適切にエスケープされます。

%P

string を拡張正規表現として処理し、シェルパターンに変換します。

%q

同じ文字列を取得するためにシェルによって読み取り可能になるように引用符で囲まれた、出力 string。ただし、欠落した文字列オペランドから生成された空の文字列は囲まれません。

%R

string をシェルパターン表現として処理し、拡張正規表現に変換します。

%T

string を日付/時間文字列として処理し、書式設定します。T には (dformat) を付けることができます。ここで、dformat は、date(1) コマンドによって定義された日付形式です。

%Z

値が 0 のバイトを出力します。

数値書式指定子を満たすための string の変換を実行するとき、string の最初の文字が "or' の場合、値は "or' に続く文字の基本コードセットでの数値になります。それ以外の場合、string はシェル算術式のように扱われ、評価されます。

string オペランドをその書式指定子に該当する適切な値に完全に変換できない場合、エラーが発生しますが、残りの string オペランドの処理は続行します。

書式指定子の拡張機能に加えて、ANSI C/C99/XPG6 の次の拡張機能が書式指定子で許可されます。

  • エスケープシーケンス \E および \e は、ASCII の 8 進数 033 のエスケープ文字に展開されます。

  • エスケープシーケンス \cx は CTRL-x に展開されます。

  • エスケープシーケンス \C[.name.] は、照合要素 name に展開されます。

  • エスケープシーケンス \x{hex} は、16 進数値 hex に対応する文字に展開されます。

  • 指定された幅の中央になるようにフィールドを調整する、書式修飾子フラグ = を使用できます。出力が端末の場合、バイト数の代わりに文字幅が使用されます。

  • それぞれの整数書式指定子では、幅および精度の後に、2 から 64 までの変換の基数を指定する 3 番目の修飾子を指定できます。この場合、# 修飾子によって、base# が値の前に配置されるようになります。

  • 基数が指定されない場合に # 修飾子を d 指定子と一緒に使用して、k M G T P E のいずれかの接尾辞とともに、出力を 1000 の累乗の単位で書き出すことができます。

  • # 修飾子を i 指定子と一緒に使用して、Ki Mi Gi Ti Pi Ei のいずれかの接尾辞とともに、出力を 1024 の累乗の単位で書き出すことができます。

string オペランドが書式指定子よりも多い場合は、書式文字列は最初から再処理されます。string オペランドが書式指定子よりも少ない場合、string 指定子は、空の文字列が指定された場合と同様に処理され、数値変換は、0 が指定された場合と同様に処理され、時間変換は、now が指定された場合と同様に処理されます。

/usr/bin/printfkshprintf 組み込み関数および print -f と同等であり、これは追加オプションを指定できます。

使用法

/usr/bin/printf

printf ユーティリティーは、基本とする printf(3C) 関数と同様、%c 変換仕様を使用するときに、複数バイト文字を扱うための特殊なプロビジョニングを行いません。文字列セットに複数バイト文字がある場合、アプリケーションではこれらのいずれの関数を使用するかについて注意を払う必要があります。

フィールド幅および精度は * として指定できません。

%b 変換仕様は ISO C 標準ではなく、echo ユーティリティーによって提供された文字列オペランド内に展開されるバックスラッシュエスケープを処理するための移植性のある方法としてここで追加されたものです。echo ユーティリティーの従来バージョンのすべての代替として printf を使用する方法については、echo(1) マニュアルページの使用法セクションも参照してください。

対応する変換仕様に対して引数を正しく解釈できない場合、printf ユーティリティーはエラーを報告します。したがって、数値変換に使用される引数の末尾のオーバーフローおよび余分な文字が、エラーとして報告されます。

引数オペランドが c または s 変換で完全に使用されないか、文字列オペランドの 1 番目または 2 番目の文字が文字の数値を取得するために使用される場合、エラーとみなされません。

/usr/bin/printf の例

使用例 1 一連のプロンプトの出力

次の例は、ユーザーに警告したあと、一連のプロンプトを出力して読み取ります。

example% printf "\aPlease fill in the following: \nName: "
read name
printf "Phone number: "
read phone
使用例 2 計算テーブルの出力

次の例は計算テーブルを出力します。ファイルから正しい回答および間違った回答のリストを読み取り、割合を正しく計算して結果を出力します。数値は右寄せで、1 つのタブ文字で区切られます。割合は小数第 1 位の精度で書き込まれます。

example% while read right wrong ; do
   percent=$(echo "scale=1;($right*100)/($right+$wrong)" | bc)
   printf "%2d right\t%2d wrong\t(%s%%)\n" \
	   $right $wrong $percent
done < database_file
使用例 3 数値文字列の出力

次のコマンド

example% printf "%5d%4d\n" 1 21 321 4321 54321

結果:

    1  21
  3214321
54321   0

format オペランドは、指定されたすべての文字列を出力するために 3 回使用され、最後の %4d 変換仕様を満たすために printf によって 0 が補われています。

使用例 4 変換エラーの作表

次の例は、変換エラーを表で示したものです。

printf ユーティリティーは、数値出力の生成中に変換エラーが検出された場合にユーザーに通知します。これらの結果は、format オペランドとして %d が指定されたときに、32 ビットの 2 の補数整数が実装された場合に想定されます。

引数
標準
診断
5a
5
printf: 5a は完全に変換されていません
9999999999
2147483647
printf: 9999999999: 結果が大きすぎます
-9999999999
-2147483648
printf: -9999999999: 結果が大きすぎます
ABC
0
printf: ABC が数値ではありません

標準出力に表示される値は、関数 strtol(3C) の戻り値として想定されるものです。類似の対応関係は、 %ustrtoul(3C) との間や、%e%f、および %gstrtod(3C) との間に存在します。

使用例 5 特定のロケールについての出力

次の例では、特定のロケール用の出力が出力されます。ISO/IEC 646:1991 標準を基本コードセットとして使用したロケールで、次のコマンドがあるとします。

example% printf "%d\n" 3 +3 -3 \'3 \"+3 "'-3"

結果:

3
定数 3 の数値
3
定数 3 の数値
-3
定数 -3 の数値
51
ISO/IEC 646:1991 標準コードセットでの文字「3」の数値
43
ISO/IEC 646:1991 標準コードセットでの文字「+」の数値
45
ISO/IEC 646:1991 標準コードセットでの文字「-」の数値

複数バイト文字を使用するロケールでは、文字の値は、文字の wchar_t 表現と同等の値を意図しています。

引数オペランドを、対応する変換仕様に該当する内部の値に完全に変換できない場合、診断メッセージが標準エラーに書き込まれ、ユーティリティーは終了ステータス 0 で終了しますが、残りのオペランドを引き続き処理し、エラーが検出された時点で蓄積された値を標準出力に書き込みます。

ksh の例

次の例は、printfksh93 バージョンの使用例です。

使用例 6 代替の浮動小数点表現 1

printf ユーティリティーは、代替の浮動小数点表現 (“%a”/” %A”の printf(3C) 項目を参照) をサポートしており、これにより、通常の 16 進数から 10 進数への丸め誤差を回避するフォーマットでの浮動小数点値の出力が可能です。

example% printf "%a\n" 2 3.1 NaN

結果:

0x1.0000000000000000000000000000p+01
0x1.8ccccccccccccccccccccccccccdp+01
nan
使用例 7 代替の浮動小数点表現 2

次の例は、同じ浮動小数点値の 2 つの異なる表現を示しています。

example% x=2 ; printf "%f == %a\n" x x

結果:

2.000000 == 0x1.0000000000000000000000000000p+01
使用例 8 Unicode 値の出力

次のコマンドは、EURO Unicode 記号 (コードポイント 0x20ac) が出力されます。

example% LC_ALL=en_US.UTF-8 printf "\u[20ac]\n"

結果:

<euro>

ここで、<euro> は EURO 通貨記号文字を表します。

使用例 9 Unicode 文字から Unicode コードポイント値への変換

次のコマンドは、特定の文字の 16 進値を出力します。

example% export LC_ALL=en_US.UTF-8
example% printf "%x\n" "'<euro>"

ここで、<euro> は EURO 通貨記号文字 (コードポイント 0x20ac) を表します。

結果:

20ac
使用例 10 ASCII 文字の数値の出力
example% printf "%d\n" "'A"

結果:

65
使用例 11 言語に依存する日付と時間の書式の出力

言語に依存する日付と時間の書式を出力するには、次の文を使用できます。

example% printf "format" weekday month day hour min

たとえば、

$ printf format "Sunday" "July" 3 10 2

米国の使用法では、書式は次の文字列を指定できます。

"%s, %s %d, %d:%.2d\n"

次のメッセージを生成します。

Sunday, July 3, 10:02

EU の使用法では、書式は次の文字列を指定できます。

"%1$s, %3$d. %2$s, %4$d:%5$.2d\n"

「$」文字は、次のように正しくエスケープする必要があります。

"%1\$s, %3\$d. %2\$s, %4\$d:%5\$.2d\n" in this case

次のメッセージを生成します。

Sunday, 3. July, 10:02

環境変数

printf の実行に影響を与える次の環境変数についての詳細は、environ(7) を参照してください。LANG、LC_ALL 、LC_CTYPE、LC_MESSAGES、LC_NUMERIC、および NLSPATH。

終了ステータス

次の終了ステータスが返されます。

0

正常終了。

>0

エラーが発生しました。

属性

属性についての詳細は、マニュアルページの attributes(7) を参照してください。

/usr/bin/printf

属性タイプ
属性値
使用条件
text/locale
CSI
有効
インタフェースの安定性
確実
標準
standards(7) を参照してください。

ksh

属性タイプ
属性値
使用条件
system/core-os
インタフェースの安定性
不確実

関連項目

awk(1), bc(1), date(1), echo(1), ksh(1), printf(3C), strtod(3C), strtol(3C), strtoul(3C), attributes(7), environ(7), formats(7), standards(7)

printf(3C) またはこのマニュアルページに表示されていない書式指定子 (「%」に続く文字) を使用した場合、未定義の動作が発生します。

printf(3C) またはこのマニュアルページに表示されていないエスケープシーケンス (バックスラッシュ ('\') に続く文字) を使用した場合、未定義の動作が発生します。

浮動小数点値は C99、XPG6、および IEEE 754 標準の動作に従い、プラットフォームの |long double| データ型と同じ方法で値を処理できます。

浮動小数点値では符号が単独で処理されるため、NaN (例: -nan)、無限 (例: -inf) およびゼロ (例: -0.0) などの値に符号を使用できます。