printf コマンド入門 - echo より正確な書式付き出力
printf でできること
echo で文字を表示するのには慣れたけれど、「桁をそろえたい」「小数点以下を2桁にしたい」と思ったことはないだろうか。そんなときに使うのが printf コマンドだ。
結論(先に要点)
printfは 書式(フォーマット)を指定して 文字を出力するコマンドechoと違い、改行は自動で付かない(\nを自分で書く)%s(文字列)・%d(整数)・%f(小数)に値を流し込む%5dや%-10sで 桁そろえ、%.2fで 小数の桁数 を指定できる
この記事でわかること
printfとechoの違いと使い分け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 はどう書けばいいんですか?%s から見てみよう。%s の s は 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 以外にもあるんですか?%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.000000、110.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 円