English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Shell printf コマンド

前章ではShellのechoコマンドについて学びました。本章ではShellの別の出力コマンドであるprintfについて学びましょう。

printfコマンドはCプログラムライブラリ内のprintf()関数を模倣しています。

printfはPOSIX標準に定義されており、そのためprintfを使用するスクリプトはechoを使用するスクリプトよりも移植性が良くなります。

printfは参照テキストまたはスペースで区切られたパラメータを使用し、外部でフォーマット化された文字列を使用できます。また、文字列の幅や左寄せ、右寄せなどの設定も可能です。デフォルトではprintfはechoのように自動的に改行符を追加しません。\nを手動で追加できます。

printf コマンドの構文:

printf  format-string  [arguments...]

パラメータ説明:

  • format-string: はフォーマット制御文字列です。

  • arguments: は引数リストです。

$ echo "Hello, Shell"
Hello, Shell
$ printf "Hello, Shell\n"
Hello, Shell
$

次に、printfの強大な機能を示すためにスクリプトを使います:

#!/bin/bash
# author:基本チュートリアルサイト
# url:ja.oldtoolbag.com
 
printf "%%-10s %%-8s %%-4s\n" 姓名 性別 体重kg  
printf "%%-10s %%-8s %%-4.2f\n" 郭靖 男です 66.1234 
printf "%%-10s %%-8s %%-4.2f\n" 楊過 男です 48.6543 
printf "%%-10s %%-8s %%-4.2f\n" 郭芙 女です 47.9876

スクリプトを実行し、以下の結果を出力します:

姓名  性别  体重kg
郭靖  男      66.12
楊過  男      48.65
郭芙  女      47.99

%s %c %d %f はフォーマット置換文字です、%s 文字列を出力する、%d 整数を出力する、%c 文字を出力する、%f 実数を出力し、小数形式で出力します。

%-10s は幅が 10 文字(- を表示します(左寄せ、指定しない場合は右寄せ)、どんな文字も 10 文字幅の文字内で、不足すると自動的にスペースで埋め尽くし、超えるとすべての内容が表示されます。

%-4.2f は小数形式にフォーマット化する、その中で .2 指2桁小数。

#!/bin/bash
# author:基本チュートリアルサイト
# url:ja.oldtoolbag.com
 
# format-string はダブルクォートで囲まれています
printf "%d %s\n" 1 "abc"
# スラッシュで囲まれた引数とダブルクォートで囲まれた引数の効果は同じです 
printf '%d %s\n' 1 "abc" 
# 引用符はなくても出力できます
printf %s abcdef
# フォーマットには1つのパラメータが指定されていますが、余分なパラメータもそのフォーマットに従って出力されます,format-string が再利用されます
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 引数がなければ、%s は NULL で置き換え、%d は 0 で置き換えます
printf "%s and %d \n"

スクリプトを実行し、以下の結果を出力します:

1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j  
 and 0

printf のエスケープシーケンス

シーケンス説明
\a警告文字、通常はASCIIのBEL文字
\bバックスペース
\c出力結果の最後に終わりのカラムを抑制(表示しない)(%b フォーマット指示子制御下のパラメータ文字列中のみ有効)
\fフォームフィード(Formfeed)
\n改行
\rキャリッジリターン(Carriage return)
\t水平タブ
\v垂直タブ
\\文字的な反斜線文字
\dddを表す1から3桁の8進数値の文字。フォーマット文字列中のみ有効
\0dddを表す1から3の8進数値文字
$ printf "a string, no processing:<%s>\n" "A\nB"
a string, no processing:<A\nB>
$ printf "a string, no processing:<%b>\n" "A\nB"
a string, no processing:<A
B>
$ printf "ja.oldtoolbag.com \a"
ja.oldtoolbag.com $                  #改行せず