書式設定された出力を印刷するための Bash printf コマンドの使用

Linux コマンド ラインで印刷する最も簡単な方法は、echo コマンドを使用することです。

                
                  echo "Value of var is $var"
                
              

ただし、書式設定された出力を印刷する必要がある場合、echo コマンドは適切ではありません。

ここで printf コマンドが役に立ちます。 bash printf コマンドは、C/ の printf コマンドと同じように動作します。C++ プログラミング言語.

                
                  printf "My brother %s is %d years old.n" Prakash 21
                
              

出力を推測できますか?

最初の引数 %s 文字列を期待し、 %d C/C++ と同様に、10 進数の整数が必要です。 C/C++ に慣れていなくても心配はいりません。

Bash スクリプトで printf コマンドを使用するためだけに学習する必要はありません。 Bash の printf コマンドの例をいくつか示します。

Bash printf コマンドの使用

まず構文から始めましょう。

                
                  printf format [arguments]
                
              

ここ、 format 後続の値がどのように表示されるかを決定する文字列です。

例では printf "My brother %s is %d years old.n" Prakash 21 、「私の兄弟%sは%d歳です.n」全体がフォーマットであり、その後に引数が続きます Prakash 21 . 引数は、この記事の後半で説明する書式指定子 (%s、%d など) を置き換えるために使用されます。

最も単純な形式では、文字列を表示するための echo コマンドとして printf を使用できます。

                
                  printf "Hello Worldn"
                
              

改行文字に注意してください n 最後に? のecho コマンドと printf コマンドの違いecho は最後に改行文字を自動的に追加しますが、printf の場合は明示的に追加する必要があります。

引数の型と数に特に注意してください

フォーマット文字列はすべての引数に適用されることに注意してください。 これが、特に注意を払う必要がある理由です。

                
                  [email protected]:~$ printf "Hello, %s! n" Abhishek Prakash
Hello, Abhishek! 
Hello, Prakash!
                
              

同様に、書式文字列で期待される書式指定子の種類にも注意を払う必要があります。

上記の例でわかるように、意図した引数が見つからない場合、文字列の場合は null で整数の場合は 0 である既定値が表示されます。

                
                  printf "Hi %s, your room number is %d. n" Abhishek Prakash 131
bash: printf: Prakash: invalid number
Hi Abhishek, your room number is 0. 
Hi 131, your room number is 0.
                
              

ここで、 Abhishek Prakash 引数の最初のセットとして 131 引数の 2 番目のセットとして。

整数ではなく文字列 (Prakash) が見つかった場合、エラーが発生しますが、2 番目の引数がデフォルト値 0 の出力を表示し続けます。

同様に、131 は 2 番目の引数セットの文字列として認識され、2 番目の引数が存在しないため、デフォルトで 0 になります。

フォーマット指定文字

出力を目的の形式で表示するために使用できる形式指定子がいくつかあります。 最も一般的なもののいくつかを次に示します。

キャラクター 使用法
%s
%c 1文字
%d 整数
%o 8 進整数
%バツ 16 進整数
%f 浮動小数点
%b バックスラッシュのエスケープ文字を含む文字列
%% パーセント記号

書式指定子について理解できたところで、実際の動作を示す例をいくつか見てみましょう。

Bash printf コマンドの例

これらの例のほとんどは、一目瞭然であるため、詳細な説明は必要ないと思います。

                
                  [email protected]:~$ printf "The octal value of %d is %on" 30 30
The octal value of 30 is 36
                
              

の使用を見てみましょう %b バックスラッシュのエスケープ文字を正しく解釈するための指定子。

                
                  [email protected]:~$ printf "String with backslash: %sn" "HellonWorld!"
String with backslash: HellonWorld!
                
              

あなたが見る %s 、違いはありません。 しかし、 %b 改行エスケープ文字は正しく解釈されます。

                
                  [email protected]:~$ printf "String with backslash: %bn" "HellonWorld!"
String with backslash: Hello
World!
                
              

を使用するときは、 %c 、一度に文字のみを読み取ります。

                
                  [email protected]:~$ printf "Character: %cn" a
Character: a
[email protected]:~$ printf "Character: %cn" a b c
Character: a
Character: b
Character: c
[email protected]:~$ printf "Character: %cn" abc
Character: a

                
              

修飾子を使用して printf 出力を特定のスタイルで表示する

好みに応じて出力の外観を変更する修飾子があります。

# 8 進数と 16 進数の修飾子

前に、の使用を見ました %o 10 進数を 8 進数に変換します。 ただし、それが 8 進数であるかどうかはあまり明確ではありませんでした。 を使用できます。 # 8 進数と 16 進数を適切な形式で表示する修飾子。

                
                  [email protected]:~$ printf "%d is %#o in octal and %#x in hexadecimaln" 30 30 30
30 is 036 in octal and 0x1e in hexadecimal
                
              

正の整数のスペース修飾子

間にスペースを使用できます % d %d 先頭にスペースを付けて正の整数を表示します。 これは、正数と負数の列がある場合に役立ちます。 どちらがより「きれい」に見えるかを確認してください。

                
                  [email protected]:~$ printf "%d n%d n%d n" 10 -10 10
10 
-10 
10 
[email protected]:~$ printf "% d n%d n% d n" 10 -10 10
 10 
-10 
 10 

                
              

幅修飾子

幅修飾子は、引数の最小フィールド幅を指定する整数です。

デフォルトでは、右揃えです。

                
                  [email protected]:~$ printf "%10s| %5dn" Age 23
       Age|    23

                
              

追加することで左揃えにすることができます - それにフラグを立てます:

                
                  [email protected]:~$ printf "%-10s| %-5dn" Age 23
Age       | 23
                
              

精度修飾子

精度修飾子 (.) ドットを使用して、表示する最小桁数を指定できます。 %d %u %o %x . 値の左側にゼロ パディングを追加します。

                
                  [email protected]:~$ printf "Roll Number: %.5dn" 23
Roll Number: 00023
                
              

文字列で精度修飾子を使用すると、文字列の最大長が指定されます。 文字列がそれより長い場合、表示では切り詰められます。

                
                  [email protected]:~$ printf "Name: %.4sn" Abhishek
Name: Abhi

                
              

幅と精度の両方の修飾子を組み合わせることができます。

                
                  [email protected]:~$ printf "Name: %.4sn" Abhishek
Name: Abhi
[email protected]:~$ printf "Name: %10.4sn" Abhishek
Name:       Abhi
                
              

おまけの例: printf を使用して出力を表形式で表示する

printf コマンドについて学んだことを、もう少し複雑な例を使って有効に活用しましょう。 これにより、bash スクリプトでの printf コマンドの真の可能性が示されます。

printf コマンドを使用して、bash を使用して次の表を出力してみましょう。

名前 ID グレード
シャーロック・ホームズ 0000122 23
ジェームズ・ボンド 0000007 27
ヘラクレス・ポワロ 0006811 59 G
ジェーン・マープル 1234567 71 C

このタスク用に作成したシェル スクリプトを次に示します。 スクリプトは異なる場合があります。

                
                  #/bin/bash
seperator=--------------------
seperator=$seperator$seperator
rows="%-15s| %.7d| %3d| %cn"
TableWidth=37

printf "%-15s| %-7s| %.3s| %sn" Name ID Age Grades
printf "%.${TableWidth}sn" "$seperator"
printf "$rows" "Sherlock Holmes" 122 23 A
printf "$rows" "James Bond" 7 27 F
printf "$rows" "Hercules Poirot" 6811 59 G
printf "$rows" "Jane Marple" 1234567 71 C
                
              

この bash シェル スクリプトを実行すると、次のように表示されます。

bash printf コマンドを使用して、スクリプトの出力を美しく書式設定して印刷するのは素晴らしいことだと思いませんか?

Linux の printf コマンドに関するこの詳細なチュートリアルが気に入っていただければ幸いです。 ご質問やご提案がありましたら、お知らせください。 また、Linux ハンドブックのメンバーになることを忘れないでください。Linux に関するより詳しい情報が得られます。