書式
printf FORMAT [ARGUMENT...]

概要

printf コマンドは ARGUMENT
書式文字列 FORMAT に従って埋め込み、
結果を表示します。

FORMAT
変換指定を含められます。

各変換指定は
引数に対応する
変換指定に応じて
次々に置き換えられます。

変換指定の詳細は
以下で詳述します。

変換指定は
C言語の printf(3) 由来です。

echo とは異なり、
printf は文字列の一部に
\n を指定しない限り
改行を付加しません。

なお、
fishのビルトイン printf
GNU Coreutils 6.9の printf と同等です。

OSに付属しているなど
新しいバージョンの
printf を使いたいならば、
command printf を使ってください。

変換指定

以下の変換指定が使えます。

%d
10進数(符号付き、符号無し)。
%i
符号付き整数。
%o
符号無し8進数。
%u
符号無し10進数。
%x / %X=
符号無し16進数。
%f / %g / %G
浮動小数点数。
%e / %E=
科学的記数法による浮動小数点数(XXXeYY形式)。
%s
文字列。
%b
バックスラッシュエスケープを解釈する文字列。
ただし8進数エスケープは \0 または \0ooo 形式。
%%
% そのもの。

注意:変換は失敗することがあります。
たとえば、 102.234
整数に変換できないため、
printf はエラーを起こします。

バックスラッシュエスケープ

printf
バックスラッシュエスケープを解釈します。

\"
ダブルクォート
\\
バックスラッシュ
\a
アラート(BEL) (^G)
\b
バックスペース(^H)
\c
これ以上出力しないようにする
\e
ESC文字 (^[)
\f
フォームフィード (^L)
\n
改行文字 (^J)
\r
キャリッジリターン (^M)
\t
タブ文字 (^I)
\v
垂直タブ (^K)
\ooo
8進数ooo(1〜3文字)で表されるバイト
\xhh
16進数hh(1〜2文字)で表されるバイト
\uhhhh
16ビットUnicode文字の16進数表記hhhh
\Uhhhhhhhh
32ビットUnicode文字の16進数表記hhhhhhhh

書式文字列は
引数全てを変換するのに
必要な限り何度も再利用されます

引数に不適切な
書式指定がある場合は
エラーになります。

たとえば、
printf "%d" 102.234
はエラーになります。

なぜなら、
102.234 は整数として
整形できないからです。

使用例

$ printf '%s\t%s\n' flounder fish
flounder    fish

上記は
タブ文字で区切られて表示され、
改行されます。

これは
自分独自の補完を記述する のに便利です。
なぜなら、
fishの補完スクリプトは
「選択肢 タブ文字 説明文」
の出力が求められるからです。

$ printf '%s:%d' 'Number of bananas in my pocket' 42
Number of bananas in my pocket: 42

上記は改行を出力しません。

最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。