本記事ではbashでのprintfの使い方を解説します。基本的な使い方と合わせて同じ標準出力機能を持つechoとの違いも説明しています。
printfとは
printfはC言語由来の出力コマンドで、bash内で書式を指定したテキスト出力を行うことができます。書式文字列を使って出力を細かく制御でき、特に整形された出力が必要な場合に便利です。
構文
bashでのprintfの基本構文は次のとおりです。
printf "フォーマット" [引数...]
フォーマットには通常のテキストと特殊な書式指定子(%で始まる)を含めることができ、書式指定子は順番に引数の値で置き換えられます。
基本的な例
単純な文字列の出力
基本的な文字列を出力する例です。末尾の\nは改行を意味します。
printf "Hello, World!\\n"
# 出力: Hello, World!
変数を含む出力
変数の内容を文字列内に埋め込む例です。%sは文字列の書式指定子です。
name="John"
printf "Hello, %s!\\n" "$name"
# 出力: Hello, John!
数値のフォーマット
整数と浮動小数点数を異なる書式で出力する例です。
printf "整数: %d\\n浮動小数点: %f\\n" 42 3.14159
# 出力: 整数: 42
# 浮動小数点: 3.141590
主なオプション
文字列の出力
%s書式指定子を使って文字列を出力します。変数やテキストを文字列として表示できます。
構文
printf "%s" 文字列
コード例
基本的な文字列の出力と複数の文字列を一度に出力する例です。
name="Alice"
printf "名前: %s\\n" "$name"
printf "複数の文字列: %s, %s, %s\\n" "赤" "青" "緑"
# 出力
名前: Alice
複数の文字列: 赤, 青, 緑
整数値の出力
%dや%i書式指定子を使って10進数の整数値を出力します。%dと%iは同じ機能を持ちます。
構文
printf "%d" 整数値
printf "%i" 整数値
コード例
整数値を様々な形式で出力する例です。変数に格納された整数値も使用できます。
printf "数値: %d\\n" 42
count=10
printf "カウント: %i\\n" "$count"
printf "複数の整数: %d, %d, %d\\n" 1 2 3
# 出力
数値: 42
カウント: 10
複数の整数: 1, 2, 3
浮動小数点数の出力
%f書式指定子を使って浮動小数点数を出力します。デフォルトでは小数点以下6桁まで表示されます。
構文
printf "%f" 浮動小数点数
コード例
浮動小数点数を異なる精度や幅で出力する例です。精度や表示幅の調整方法も示しています。
printf "円周率: %f\\n" 3.14159
printf "小数点以下2桁: %.2f\\n" 3.14159
printf "幅10文字、小数点以下3桁: %10.3f\\n" 3.14159
# 出力
円周率: 3.141590
小数点以下2桁: 3.14
幅10文字、小数点以下3桁: 3.142
単一文字の出力
%c書式指定子を使って単一の文字を出力します。ASCIIコードから対応する文字に変換することも可能です。
構文
printf "%c" 文字
コード例
文字を直接指定する方法とASCIIコードを使用して文字を出力する例です。
printf "文字: %c\\n" "A"
printf "ASCIIコード65の文字: %c\\n" 65
printf "複数の文字: %c%c%c\\n" "X" "Y" "Z"
# 出力
文字: A
ASCIIコード65の文字: A
複数の文字: XYZ
エスケープシーケンスの解釈
%b書式指定子を使って文字列内のバックスラッシュエスケープシーケンス(\n、\t、\a等)を解釈して出力します。
構文
printf "%b" 文字列
コード例
様々なエスケープシーケンスを含む文字列を%bで解釈して出力する例です。
printf "%b" "Tab区切り:\\tテキスト\\n改行後のテキスト"
printf "%b" "ベル音: \\a"
printf "%b" "バックスラッシュ: \\\\\\n"
# 出力
Tab区切り: テキスト
改行後のテキスト
ベル音: [ベル音が鳴る]
バックスラッシュ: \\
16進数の出力
%xと%X書式指定子を使って整数値を16進数で出力します。%xは小文字(a-f)、%Xは大文字(A-F)を使用します。
構文
printf "%x" 整数値
printf "%X" 整数値
コード例
同じ数値を小文字と大文字の16進数で出力する例です。カスタム表記のための組み合わせ方も示しています。
printf "16進数(小文字): %x\\n" 255
printf "16進数(大文字): %X\\n" 255
printf "プレフィックス付き: 0x%x\\n" 255
# 出力
16進数(小文字): ff
16進数(大文字): FF
プレフィックス付き: 0xff
出力の幅と精度の制御
書式指定子に幅や精度の値を追加して、出力の見た目を制御できます。幅は最小フィールド幅を指定し、精度は小数点以下の桁数を指定します。
構文
printf "%[幅].[精度]f" 数値
printf "%[幅]s" 文字列
コード例
さまざまな幅と精度の指定方法を示す例です。右寄せ、左寄せ、0埋めなどの書式設定ができます。
printf "右寄せ10文字幅: '%10s'\\n" "test"
printf "左寄せ10文字幅: '%-10s'\\n" "test"
printf "0埋め5桁整数: '%05d'\\n" 42
printf "小数点以下2桁: '%.2f'\\n" 3.14159
printf "10文字幅、小数点以下3桁: '%10.3f'\\n" 3.14159
# 出力
右寄せ10文字幅: ' test'
左寄せ10文字幅: 'test '
0埋め5桁整数: '00042'
小数点以下2桁: '3.14'
10文字幅、小数点以下3桁: ' 3.142'
パーセント記号の出力
%%書式指定子を使って実際のパーセント記号(%)を出力します。
構文
printf "%%"
コード例
パーセント記号自体を出力する例です。書式指定子の例示にも使用できます。
printf "割合: 25%%\\n"
printf "書式指定子の例: %%s, %%d, %%f\\n"
# 出力
割合: 25%
書式指定子の例: %s, %d, %f
echoとの違い
改行の扱い
echoはデフォルトで最後に改行を追加しますが、printfは明示的に\nを指定しない限り改行しません。
# echoの例
echo "Hello World"
# 出力: Hello World
# (最後に自動的に改行されます)
# printfの例
printf "Hello World\\n"
# 出力: Hello World
# (\\nで明示的に改行を指定)
書式制御
echoは基本的な出力のみ(-eオプションでエスケープシーケンス解釈可)に対応していますが、printfは詳細な書式制御が可能です。
シェルによる互換性
echoはシェルによって挙動が異なることがありますが、printfはPOSIXで標準化されており互換性が高いという特徴があります。
注意点
フォーマット指定子と引数の数 引数が足りない場合は空や0として扱われ、多すぎる場合はフォーマット文字列が再利用されます。
引数の数が合わない場合の挙動を示す例です。
printf "%s %s\\n" "one" # "one "と出力(2つ目は空)
printf "%s\\n" "one" "two" # "one"と"two"を別々の行に出力
エスケープシーケンスの扱い 特殊文字をエスケープする必要があります。
タブ(\t)や引用符(”)など特殊文字のエスケープ例です。
printf "タブ:\\t区切り\\n"
printf "引用符:\\"引用\\"\\n"
数値の精度 浮動小数点数のデフォルト表示は多くの小数点以下桁数を表示します。
浮動小数点数の精度を制御する例です。%fはデフォルトで6桁、%.2fは小数点以下2桁に制限します。
printf "%f\\n" 3.14 # 3.140000と表示される
printf "%.2f\\n" 3.14 # 3.14と表示される
まとめ
bashのprintfコマンドは、出力の書式を細かく制御したい場合に非常に便利なツールです。echoよりも多機能で、特に
- 表形式のデータ表示
- 数値の精密なフォーマット
- 位置揃えが必要な出力
- 複雑なレポート生成
などに適しています。C言語や他のプログラミング言語経験者にとっては馴染みやすい構文で、シェルスクリプトの出力をより洗練されたものにできます。