通常、bashスクリプトを作成するときは、 echoを使用します 標準出力に印刷します。 echo は単純なコマンドですが、機能が制限されています。
出力のフォーマットをより細かく制御するには、 printfを使用します。 コマンド。
printf コマンドは、Cの printf()と同様に、引数をフォーマットして出力します。 機能。
printf コマンド#
printf は、Bashや、ZshやKshなどの他の一般的なシェルに組み込まれているシェルです。スタンドアロンの/usr / bin / printfもあります バイナリですが、シェルビルトインバージョンが優先されます。 printfのBashビルトインバージョンについて説明します 。
printfの構文 コマンドは次のとおりです:
printf [-v var] format [arguments]
-v オプションはprintfに指示します 出力を出力するのではなく、変数に割り当てます。
format は、3つの異なるタイプのオブジェクトを含む可能性のある文字列です。
- そのまま出力に出力される通常の文字。
- バックスラッシュでエスケープされた文字。解釈されてから印刷されます。
- フォーマットを記述し、フォーマット文字列に続くそれぞれの引数の値に置き換えられる変換仕様。
このコマンドは、任意の数の引数を受け入れます 。より多くの引数の場合 フォーマット指定子が提供されているよりも、 format 文字列は、すべての引数を消費するために再利用されます。 引数が少ない場合 形式指定子が指定されている場合、追加の数値形式指定子はゼロ値に設定され、文字列形式指定子はnull文字列に設定されます。
以下は、引数を渡すときに考慮すべきいくつかのポイントです printf コマンド:
- シェルは、引数を
printfに渡す前に、すべての変数、ワイルドカードマッチング、および特殊文字を置き換えます。 コマンド。 - 一重引用符を使用する場合
''引用符で囲まれた各文字のリテラル値は保持されます。変数とコマンドは展開されません。
printf "Open issues: %s\nClosed issues: %s\n" "34" "65" Open issues: 34
Closed issues: 65
文字列未解決の問題:%s \ n未解決の問題:%s \ n formatです 一方、「34」と「65」は引数です。フォーマット文字列には2つの改行文字が含まれています( \ n )と2つのフォーマット指定子(%s )引数に置き換えられます。
printf コマンドは改行文字を追加しません( \ n )行末。
バックスラッシュでエスケープされた文字#
バックスラッシュでエスケープされた文字は、フォーマット文字列または%bに対応する引数で使用された場合に解釈されます。 変換指定子。最も一般的なエスケープ文字のリストは次のとおりです。
-
\\-円記号を表示します。 -
\ b-バックスペース文字を表示します。 \n-新しい行を表示します。-
\ r-キャリッジリターンを表示します。 -
\ t-水平タブを表示します。 -
\ v-垂直タブを表示します。
変換仕様#
変換仕様は次の形式を取ります:
%[flags][width][.precision]specifier
各変換仕様には、パーセント記号(%)が付いています。 )、オプションの修飾子を含み、データ型を表す次の文字のいずれかで終わります( specifier )対応する引数の: aAbcdeEfgGioqsuxX 。
型変換指定子#
型変換指定子 対応する引数の解釈方法を指定する文字です。この文字は必須であり、オプションのフィールドの後に配置されます。
以下は、すべての型変換とその機能を示すリストです。
-
%b-バックスラッシュエスケープシーケンスを展開しながら引数を出力します。 -
%q-引数をシェル引用符で囲み、入力として再利用可能に出力します。 -
%d、%i-引数を符号付き10進整数として出力します。 -
%u-引数を符号なし10進整数として出力します。 -
%o-引数を符号なし8進整数として出力します。 -
%x、%X-引数を符号なし16進整数として出力します。%x小文字と%Xを出力します 大文字で印刷します。 -
%e、%E-引数を指数表記の浮動小数点数として出力します。%e小文字と%Eを出力します 大文字で印刷します。 -
%a、%A-引数を16進小数表記の浮動小数点数として出力します。%a小文字と%Aを出力します 大文字で印刷します。 -
%g、%G-引数を浮動小数点数として、通常の表記または指数表記のいずれか、指定された値と精度に適した方で出力します。%g小文字と%Gを出力します 大文字で印刷します。 -
%c-引数を1文字で出力します。 -
%f-引数を浮動小数点数として出力します。 -
%s-引数を文字列として出力します。 -
%%-リテラルの%を出力します シンボル。
符号なしの数値はゼロと正の数を表し、符号付きの数値は負、ゼロ、および正の数を表します。
次のコマンドは、3つの異なる数値システムで数値100を出力します。
printf "Decimal: %d\nHex: %x\nOctal: %o\n" 100 100 100 Decimal: 100
Hex: 64
Octal: 144
フラグディレクティブ#
フラグは最初のオプションの修飾子であり、位置揃え、先行ゼロ、接頭辞などを設定するために使用されます。
最も一般的なものは次のとおりです。
-
--印刷されたテキストをフィールド内で左揃えにします。デフォルトでは、テキストは右揃えになっています。 -
+-番号の前に+を付けます または-兆候。デフォルトでは、負の数のみに負の記号が接頭辞として付けられます。 -
0-数字をスペースではなく先行ゼロで埋めます。 - 空白の
-正の数には空白を、負の数にはマイナスを付けます(-。 -
#-数値の代替形式。
幅ディレクティブ#
幅コード> ディレクティブfiledは、フラグ文字の後に配置され、変換の結果となる最小文字数を指定します。
出力されたテキストの幅が指定された幅よりも小さい場合は、スペースが埋め込まれます。幅は、負でない10進整数またはアスタリスク( * )として指定できます。 。
次に例を示します:
printf "%20s %d\n" Mark 305
%20s フィールドを少なくとも20文字の長さに設定することを意味します。デフォルトでは出力が右寄せされるため、テキストの前に空白が追加されます。テキストを左揃えにするには、-を使用します フラグ(%-20s 。
Mark 305
アスタリスクの場合( * )は widthとして使用されます ディレクティブの場合、変換フィールドの幅は、フォーマットされる引数の前にあるwidth引数によって設定されます。
以下の例では、幅を10に設定しています:
printf "%0*d" 10 5
0 は、数値をブランクではなく先行ゼロで埋めるフラグです。出力テキストには少なくとも10文字が含まれます:
0000000005
精度ディレクティブ#
.precision 修飾子はドット(。)で構成されます )の後に正の整数またはアスタリスク( * )指定子のタイプに応じて、文字列または数字の文字数、または印刷する小数点以下の桁数を設定します。
精度には次の効果があります:
- 変換タイプが整数の場合、精度は印刷される最小桁数を指定します。引数の桁数が精度よりも低い場合、先行ゼロが出力されます。
- 変換タイプが浮動小数点の場合、精度は小数点文字に続く桁数を指定します。デフォルトの精度は6です。
- 変換タイプが文字列の場合、精度は印刷される最大文字数を指定します。引数の文字数が精度よりも大きい場合、余分な文字は切り捨てられます。
浮動小数点数を小数点以下3桁に丸める方法を示す例を次に示します。
printf "%.3f" 1.61803398 1.618
精度がアスタリスク( * )に設定されている場合 )、その値は、フォーマットされている引数の前にある精度引数によって設定されます。
printf "%.*f" 3 1.61803398 1.618
結論#
printf コマンドはフォーマットと引数を取り、フォーマットされたテキストを出力します。
ご質問やご意見がございましたら、お気軽にコメントをお寄せください。