printf コマンド入門 - echo より正確な書式付き出力

printf コマンド入門 - echo より正確な書式付き出力

printf でできること

echo で文字を表示するのには慣れたけれど、「桁をそろえたい」「小数点以下を2桁にしたい」と思ったことはないだろうか。そんなときに使うのが printf コマンドだ。

結論(先に要点)

  • printf書式(フォーマット)を指定して 文字を出力するコマンド
  • echo と違い、改行は自動で付かない\n を自分で書く)
  • %s(文字列)・%d(整数)・%f(小数)に値を流し込む
  • %5d%-10s桁そろえ%.2f小数の桁数 を指定できる

この記事でわかること

  • printfecho の違いと使い分け
  • printf の基本の形(書式文字列 + 値)
  • %s %d %f など主要な書式指定子の使い方
  • 桁そろえ・ゼロ埋め・小数桁数の指定方法
  • \n \t などエスケープシーケンスの使い方
  • 初心者がつまずきやすいポイント

1. printf と echo は何が違う?

結論: echo は手軽だが改行や \n の扱いが環境でばらつく。printf は書式を厳密に指定でき、出力をきれいにそろえられる。

リナ: 文字を表示するなら echo でいいんですよね? printf って何が違うんですか?
ライニー先輩: いい質問だね。echo は手軽なんだけど、「数字をそろえて表示」みたいな細かい制御が苦手なんだ。あと、環境によって挙動が変わる弱点もあるよ。
リナ: 環境によって変わるって、どういうことですか?
ライニー先輩: たとえば echo -e "a\tb" でタブを出したいとき、シェルや OS によっては -e が効かずにそのまま -e a\tb と表示されることがある。printf ならそういうブレがないんだ。
# echo は環境によって -e の扱いが変わる
echo -e "名前\t点数"

# printf なら書式どおりに必ず出力される
printf '名前\t点数\n'
名前	点数

細かい書式制御や、スクリプトで安定した出力が欲しいときは printf を選ぶと安心。ちょっと表示するだけなら echo で十分。

2. printf の基本の形は?

結論: printf '書式' 値... の形。書式の中の %s などに、後ろの値が順番に入る。改行は \n を自分で書く。

リナ: printf はどう書けばいいんですか?
ライニー先輩: 「書式文字列」と「流し込む値」の2つを並べるだけだよ。まずは文字列を表す %s から見てみよう。
リナ: %ss は string(文字列)の s ですね。
ライニー先輩: そのとおり。%s の場所に、後ろに書いた値がそのまま入るんだ。
printf '%s\n' ペンギン
ペンギン

書式文字列の %s が「ここに値が入るよ」という目印になっている。後ろの ペンギン がその位置に流し込まれ、最後の \n で改行している。

printf改行を自動で付けない\n を書き忘れると、次のプロンプトが同じ行にくっついて出る。最初のうちは必ず付けると覚えておこう。

値は複数並べられる。%s を必要なだけ書く。

printf '%s は %s が好き\n' リナ Linux
リナ は Linux が好き

3. 書式指定子(%s %d %f)の使い方は?

結論: %s は文字列、%d は整数、%f は小数。値の種類に合わせて使い分ける。

リナ: %s 以外にもあるんですか?
ライニー先輩: よく使うのは3つ。文字列の %s、整数の %d、小数の %f だよ。表にまとめるね。
指定子 意味 例の入力 出力
%s 文字列 abc abc
%d 整数(10進) 42 42
%f 小数(既定6桁) 3.14 3.140000
%x 16進数 255 ff
%% % という文字自身 (なし) %
printf '%s の値段は %d 円、税込 %f 円\n' りんご 100 110
りんご の値段は 100 円、税込 110.000000 円
リナ: あれ、%f だと 110.000000 って後ろにゼロがいっぱい付きました…
ライニー先輩: %f は何も指定しないと小数点以下6桁で出るんだ。桁数を変える方法は次の章で教えるよ。
リナ: % そのものを出したいときは %% なんですね。
ライニー先輩: そう。% は特別な記号だから、文字として出したいときは2つ重ねるのがルールだよ。

%d に小数や文字を渡すとエラーや 0 になる。たとえば printf '%d\n' abc は「数値ではない」と警告が出る。値の種類と指定子は合わせること。

4. 桁そろえと精度はどう指定する?

結論: % と指定子の間に数字を書くと幅(桁)、. のあとの数字で小数桁数を指定できる。- で左寄せ、0 でゼロ埋め。

リナ: さっきの 110.000000110.00 にしたいです。
ライニー先輩: %.2f と書けば小数点以下2桁になるよ。「. のあとの数字 = 小数の桁数」と覚えよう。
printf '%.2f\n' 110
110.00

幅(最低何文字分とるか)も指定できる。数字を表のように右そろえにしたいときに便利だ。

printf '%5d\n' 1
printf '%5d\n' 42
printf '%5d\n' 1000
    1
   42
 1000

%5d は「最低5文字分の幅をとって右そろえ」という意味。桁数が違う数字でも右端がそろう。

主な修飾の組み合わせを覚えておこう。

書き方 意味 例(出力)
%5d 幅5・右寄せ ␣␣␣42
%-5d 幅5・左寄せ 42␣␣␣
%05d 幅5・ゼロ埋め 00042
%.2f 小数2桁 3.14
%8.2f 幅8・小数2桁・右寄せ ␣␣␣␣3.14
%-10s 幅10・左寄せ文字列 abc␣␣␣␣␣␣␣

は半角スペースのこと)

リナ: %-10s- は「左寄せ」なんですね。表のラベルをそろえるのに使えそう!
ライニー先輩: まさにその用途にぴったり。商品名を左寄せ、値段を右寄せにすると、レシートみたいにきれいに並ぶよ。
printf '%-10s %5d 円\n' りんご 100
printf '%-10s %5d 円\n' バナナ 80
printf '%-10s %5d 円\n' メロン 1200
りんご       100 円
バナナ        80 円
メロン      1200 円

日本語(全角文字)は幅計算が半角基準のため、見た目が完全にはそろわないことがある。半角英数字なら桁そろえはきれいに決まる。

5. よく使うエスケープシーケンスは?

結論: \n は改行、\t はタブ、\\ はバックスラッシュそのもの。書式文字列の中で特別な意味を持つ。

リナ: \n は改行でしたよね。ほかにもあるんですか?
ライニー先輩: タブの \t がよく使われるよ。列を区切って表っぽく見せるのに便利。代表的なものを並べるね。
書き方 意味
\n 改行
\t タブ
\\ バックスラッシュ \ 自身
\r 行頭に戻る(復帰)
printf '名前\t年齢\n'
printf 'リナ\t17\n'
名前	年齢
リナ	17

バックスラッシュ自体を出したいときは \\ と2つ書く。\n のように1つだと「改行の指示」と解釈されてしまう。

6. 書式が引数より少ないとどうなる?

結論: 値が書式指定子より多いと、printf は書式を先頭から繰り返し使う。これを使うとリスト出力が一行で書ける。

リナ: printf '%s\n' a b c みたいに、%s が1つなのに値を3つ書いたらエラーになりますか?
ライニー先輩: ならないよ。printf は値が余っていると、書式をもう一度先頭から使い直すんだ。だから3行に分かれて出る。
printf '%s\n' りんご バナナ メロン
りんご
バナナ
メロン

%s\n が値の数だけ繰り返されるので、3つの値がそれぞれ改行付きで出力される。リストをきれいに縦に並べたいときの定番テクニックだ。

逆に、値が足りないと文字列は空、数値は 0 として扱われる。たとえば printf '%s と %s\n' りんご は「りんご と (空)」になる。

7. よくあるつまずきは?

結論: 改行忘れ・% の二重化忘れ・型と指定子の不一致の3つが定番。落ち着いて書式文字列を見直そう。

リナ: 自分でも書けそうな気がしてきました!でも失敗しそうで不安です…
ライニー先輩: 大丈夫。つまずくポイントは決まっているから、先に知っておけば怖くないよ。

つまずき1: 改行を忘れる

printf '%s' ペンギン だと改行されず、次のプロンプトがくっつく。末尾に \n を付ける。

つまずき2: % をそのまま書く

printf '50% 完了\n'%␣ を書式指定子と誤解する。% の文字は printf '50%% 完了\n' と二重に。

つまずき3: 型と指定子が合っていない

%d に文字列、%s のつもりで数値…という取り違え。出ない・0 になる・警告が出る原因になる。

ミニ課題(クリックで答え)

「商品名を左寄せ幅8、価格を右寄せ幅6、末尾に「円」と改行」を満たす printf を書いてみよう。

答えの一例:

printf '%-8s %6d 円\n' コーヒー 350
コーヒー      350 円

次に読む