目次
Toggle序章
Bash printfコマンドを使用すると、Linuxターミナルウィンドウに書き込むときに、echoコマンドよりも柔軟性とフォーマットを選択できます。 printfの特性でさえ有益かもしれません。
これは、ソフトウェアを使用する上で最も基本的な側面の1つです。アプリケーションが画面に書き込んだ内容を読みます。 Unixから派生したLinuxでサポートされているコマンドラインプログラムの習慣は可能な限り簡潔ですが、多くのアプリケーションは、問題が発生した場合にのみ端末に書き込みます。重要なプログラミングの基本は、何が起こっているか、何が起こるか、または最近起こったことをユーザーに通知することです。
Bashシェルのechoコマンドは、端末ディスプレイにテキストを書き込む場合があります。スクリプトまたはコマンドラインで使用でき、変数を処理して、文字列に含まれている場合はその値を表示できます。では、printfのポイントは何ですか?エコーが処理する何かをテキストで書くのではありませんか?一方、Printfは、ターミナルウィンドウに文字列を書き込む機能以上のものを提供します。出力のフォーマットに関しては、多くの汎用性があり、さらにいくつかのトリックがあります。
BashのprintfコマンドはCのprintf関数に似ていますが、いくつかの変更があります。 Cに精通している場合は、変更点に注意する必要があります。
単純な文字列の作成
ターミナルへの文字列の書き込みに関して、echoとprintfの違いを見てみましょう。
ここにエコーはいくつかの言葉です
ここのprintfはいくつかの言葉です
echoはすべての単語を出力しますが、printfは最初の単語を公開するだけです。また、printfは改行を出力しません。出力は、コマンドプロンプトの途中でsmackdabです。しかし、何よりもまず、printfがそれらに作用するためには、すべての単語を引用する必要があります。
ここにエコーはいくつかの言葉です
printf「ここにいくつかの単語があります」
それは一歩前進です。すべての単語を印刷しましたが、まだ新しい行を待っています。これは、printfは、特に要求した場合にのみ新しい行を出力するためです。これは不便に聞こえるかもしれませんが、追加するかどうかを選択できます。 printfが新しい行を出力するには、文字列に「n」を追加する必要があります。ここでは、「改行」エスケープシーケンスが使用されます。
ここにエコーはいくつかの言葉です
printf「ここにいくつかの単語があります」
改行を使用することもあれば、使用しないこともあります。この例では、一方のprintfコマンドは新しい行を使用しますが、もう一方は使用しません。
printf "How-To" && printf "Geekn"
最初のprintfは新しい行を印刷しないため、2番目のprintfからの出力は「ハウツー」と同じ行に配置されます。新しい行を印刷するために、2番目のprintfはnを使用します。コマンドプロンプトが、印刷されたテキストの下の行に表示されます。
捕獲を逃れたキャラクター
エスケープとして使用できる追加の文字を次に示します。 「n」がどのように機能するかは以前に見てきました。
n:新しい行に切り替えます。
r:このコマンドは、キャリッジリターンを出力します。出力カーソルは現在の行の先頭に戻ります。
t:このコマンドはタブ文字を出力します。
v:ページに垂直タブスペースを追加します。
\:円記号が印刷されます。
「:引用符を表示します。
b:バックスペース文字を表示します。
キャリッジリターンエスケープ文字は、カーソルを現在の行の先頭に戻すために使用されます。
printf「ハニーはすべてのevilrMoneynのルートです」
printfコマンドは、左から右に読み取ります。 printfが「r」エスケープ文字を検出するまで、文字列は通常のテキストのように書き込まれます。出力カーソルは、現在の行の先頭に再配置されます。
「r」文字のすぐ下の文字で、文字列の処理が続行されます。残りの部分により、printfは「Honey」というフレーズを置き換える「Money」を出力します。
バックスラッシュ「」文字はエスケープシーケンスを示しますが、引用符「」は文字列を引用するために使用されます。これらの文字を印刷する場合は、円記号を使用してエスケープします。これは、printfにリテラル文字として扱う必要があることを指示します。
printf "これはtTabであり、これは引用符です"、そしてこの\はバックスラッシュです "
動作中の変数
printfでの変数の使用は、echoでの変数の使用と非常によく似ています。この環境変数などの変数を含めるには、その前に通常どおりドル記号「$」を使用します。
printf "ホームディレクトリ:$HOMEn"
文字列のフォーマット
フォーマット文字列は、出力フォーマットを指定する文字列です。引数として使用するフォーマット文字列テキストと追加の値を指定します。
テキスト、エスケープシーケンス、およびフォーマット指定子はすべてフォーマット文字列に含めることができます。
Printfのフォーマット指定子は、文字列、数値、文字など、受け入れる必要のある引数の種類を通知します。
最も頻繁なフォーマット指定子を以下に示します。パーセント”パーセント”記号がそれらすべての前にあります。 2つのパーセント記号「パーセントパーセント」を組み合わせてパーセント記号を印刷できます。
- %s:文字列を出力します。
- %c:1文字を印刷します。
- %d:整数を出力します。
- %f:浮動小数点数を出力します。
- %u:符号なし整数を出力します。
- %o:値を8進数で出力します。
- %x: Prints a value in 16進数、小文字。
- %X:値を16進数で大文字で出力します。
- %e:浮動小数点数を科学的記数法で小文字で出力します。
- %E:浮動小数点数を科学的記数法で大文字で出力します。
- %%: Prints a percent “%” symbol.
printf "How-To %sn" "Geek"
printf "%s%s %sn" "How" "-To" "Geek"
最初のコマンドのフォーマット文字列には、独自のコンテンツが含まれています。文字列「Geek」が引数としてprintfに送信されます。 「%s」フォーマット指定子はそれに一致し、それを印刷します。フォーマット文字列と引数文字列の間には、スペースがあります。 Cでは、それらを区切るためにコンマが必要ですが、printfのBashバージョンでは、スペースで十分です。
2番目のフォーマット文字列には、フォーマット指定子と改行エスケープシーケンスのみが含まれます。 「%s」フォーマット指定子のそれぞれは、3つの文字列パラメーターを順番に消費します。繰り返しますが、Cでは、各パラメーターの間にコンマが必要ですが、Bashprintf関数を使用するとこの要件を無視できます。
適切なフォーマット指定子を使用して、さまざまな種類の引数を出力するだけです。これが単純なprintfベースの数値変換関数です。 10進数、8進数、および16進数の表記では、数値15を出力します。
printf "Dec:%dnOct:%onHex:%xn" 15 15 15
例をすっきりさせるために、少し減らしてみましょう。
printf "Hex:%xn" 15
私たちの大多数は、16進数が大文字でレンダリングされ、0x10未満の値の前に先行ゼロが付いているのを見るのに慣れています。これを行うには、パーセント記号「%」と「X」文字の間に幅指定子を配置し、大文字の16進形式指定子「%X」を使用します。
これは、引数がprintfに出力されるフィールドのサイズを指定します。フィールドにスペースが追加されました。このスタイルでは、2桁の数字はパディングなしで表示されます。
printf "Hex:%2Xn" 15
これで、先頭にスペースが書かれた大文字の値ができました。 2つの前にゼロを配置することにより、printfでフィールドにスペースの代わりにゼロを埋め込むことができます。
printf "Hex: %02Xn" 15
精度指定子を使用すると、出力に含める小数点の数を指定できます。
printf "Floating point: %08.3fn" 9.243546
これにより、出力を完全に揃えた結果のテーブルを簡単に作成できます。このコマンドは、Bashprintfの別の特異性も表示します。フォーマット指定子よりも多くの引数がある場合、引数はすべて使い果たされるまでバッチでフォーマット文字列にフィードされます。フォーマット文字列内のフォーマット指定子の量によって、特定の時点で処理されるバッチのサイズが決まります。 Cのprintf関数に送信された余分な引数は無視されます。
printf "Float:%8.3fn" 9.243546 23.665 8.0021
文字列には、幅と精度の指定子を使用することもできます。このコマンドを使用すると、文字列は10文字幅のフィールドに出力されます。
printf "%10s %dn" "coats" 7 "shoes" 22 "Umbrellas" 3
By default, values are right-justified in their fields. To left-justify them, use a minus sign “-
” immediately behind the percent “%
” sign.
printf "%-10s%d""コート"7"靴"22"傘"3
精度指定子を使用すると、印刷する最大文字数を選択できます。コロン文字「:」は、幅フィールドの制限を示すために使用されます。 「傘」という用語が短縮されているわけではありません。
printf ":%10.6s:n" "coats" "shoes" "Umbrellas"
printf ":%-10.6s:n""コート""靴""傘"
引数としても、幅指定子を使用できます。数値指定子の代わりに、アスタリスク「*」を使用し、整数入力として幅を指定します。
printf "% * sn"20"右端"12"中央"5"左端"
その他の奇妙なギミック
フォーマット文字列のフォーマット指定子は、コマンドラインで通常の引数として指定されているか、式の結果として作成されているかに関係なく、適切なタイプの値で動作します。
これは、2つの数値を加算した結果を表示します。
printf "23 + 32 = %dn" $((23 + 32))
現在の作業ディレクトリ内のフォルダの数は、次のコマンドで出力されます。
printf"%dディレクトリがありますn"$(ls -d * / | wc -l)
printfコマンドは、別のプログラムから返された文字列を出力します。
printf "現在のユーザー:%sn" $(whoami)
文字列フォーマット指定子「percents」に引数が指定されていない場合、printfはnullを返します。
printf "1:%s 2:%sn""アルファ"
文字列フォーマット指定子「%s」に誤って数値を指定した場合、文字列として出力し、文句を言いません。 C printfを使用してこれを行うと、多くの問題が発生します。あなたのソフトウェアはほぼ確実にクラッシュするでしょう。一方、Bashprintfは気にしないようです。
printf "One:%s two:%sn" "Alpha" 777
整数フォーマット指定子「%d」に引数が指定されていない場合、ゼロが出力されます。
printf "整数:%dn"
整数フォーマット指定子「%d」が誤って文字列入力を取得した場合、Bashはエラーメッセージを出力し、printfはゼロを出力します。
printf "整数:%dn""セブン"
厄介な記号は、「コードポイント」とも呼ばれるUnicode番号を入力することで作成できます。文字「u」は、特定の文字をエスケープするために使用され、その後にUnicode値が続きます。
printf「ユーロ記号:u20ACn」
引数文字列のエスケープシーケンスに対応するには、フォーマット文字列の「% s」文字列フォーマット指定子の代わりに、「%b」フォーマット指定子を使用します。
printf "%s" "u20ACn"
printf "%b" "u20ACn"
最初のprintfコマンドは、改行エスケープシーケンスを認識せず、Unicode値を処理しません。 2番目のprintfコマンドでは、「%b」フォーマット指定子が使用されます。 Unicode文字が適切に処理され、改行が表示されます。
コース用の馬
場合によっては、ターミナルウィンドウにテキストをエコーする必要があるかもしれません。ただし、printfは、ポジショニングとフォーマットを適用する必要がある場合のタスクに最適なツールです。
printf "%b" "Tha-" "tha-""tha-""それはすべての人です。n"