前回、文字列を出力するコマンドとして「printf」を少しだけ使ったが、今回はこのprintfに着目したい。C言語でよく利用するprintf関数のような機能を持つコマンドなので、C言語になじみのある方なら話は早いだろう。使い方もよく似ている。

C言語を使ったことがない、またはC言語とシンタックスが似た系列のプログラミング言語を使ったことがない場合、printfコマンドは少し使いにくく感じるかもしれない。printfは文字列や変数の値を表示する「echo」に似たところのあるコマンドなのだが、改行コードを明示的に指定してやる必要があるのだ。

次の例をご覧いただきたい。

# echo "Hello World!"
Hello World!
# printf "Hello World!"
Hello World!#

どちらもコマンドの後に続く文字列を出力しているが、printfのほうは改行コードが出力されないため、プロンプトが文字列の後にそのまま表示されてしまっている。

printfコマンドでechoコマンドと同じような出力を得るには、文字列の最後にLinuxやUNIXで改行を意味する「\n」というコードを書いて、次のように実行する。

# printf "Hello World!\n"
Hello World!
#

「\n」は文字列の間に挟まっていてもいいし、文字列の先頭に書いてあってもよい。途中に挟むとこんな出力になる。

# printf "Hello\nWorld!\n"
Hello
World!
#

また、文字列の最後に改行コードを連続して書いておくと、空行が出力されることになる。

# printf "Hello\nWorld!\n\n\n"
Hello
World!


#

「\n」のように、バックスラッシュに続く文字列には特殊な意味がある。よく使うのは改行(ニューライン)を意味する「\n」と、タブを意味する「\t」あたりだ。ほかにもあるので、興味があればオンラインマニュアル(man printf)を引いてみてほしい。ちなみに、タブを使うと次のような出力になる。

# printf "\tHello\n\tWorld!\n\n\n"
        Hello
        World!


#

ここからがわかりにくいかもしれないのだが、printfコマンドの1つ目の引数にはフォーマットを指定し、2つ目以降の引数に指定の実体を記述することができる。例えば「%d」というのは整数を表す指定なので、1つ目の引数に「%d」を含めた場合、それに対応する整数をその後に記述することになる。次のような感じだ。

# printf "%d\n" 10
10
#

このprintfのフォーマットを使うと、数字の出力形式を多少揃えるようなこともできる。次のように「%06d」と指定すると、全体で6桁になるように出力され、桁数が足りない部分は0で埋められる。

# printf "%06d\n" 10
000010
#

また、「%f」を使うと実数を指定できる。先ほどと同じ要領で、小数点以下の桁数なども指定可能だ。

# printf "%015.6f\n" 10.0
00000010.000000
#

そのほかにも使いそうなのは、文字列を意味する「%s」あたりだろう。その他さまざまなフォーマットが用意されているので、用途に応じて使ってみてほしい。利用可能なフォーマットは、オンラインマニュアルにひととおり書いてある。

C言語を使ったことがある方には自然なことだと思うが、これが初めてのprintfコマンド利用の場合、なぜわざわざフォーマットと値を分けて記述するのか不思議に思うかもしれない。これは、次のように変数を使うようになるとわかりやすいのではないかと思う。

# kakaku=1989
# kosu=12
# total=$(($kakaku * kosu))
# printf "\t価格\t個数\t小計\n\t%d\t%d\t%d\n" $kakaku $kosu $total
        価格      個数      小計
       1989    12      23868
#

このように、echoコマンドだけでは実現しにくい出力も、printfコマンドを使うと簡単に実現できるのだ。

yesコマンドのようにユーザーに対してインタラクティブに入力を求めるタイプのコマンドでは、あらかじめユーザーが入力しなければならない文字列をprintfで出力するようにしておき、それをパイプラインでコマンドに流し込めば、途中で入力待ちをすることなく処理を終わらせることができる。何らかのサーバとの通信でも同様だ。

ここまでくるといっそプログラミングしたほうが早いような気もするが、簡単な処理ならばprintfコマンドで実現できるということは知っておいても損はないだろう。