BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

例を使用して、Bash/Shellでprintfコマンドを使用する

この記事では、 printfを使用するための実用的な例をいくつか紹介します。 LinuxのBash/Shellでコマンドを実行します。

printf コマンドは、 echoのようなテキストを出力します コマンドは実行しますが、出力フォーマットをより細かく制御できます。

これは、独自のフォーマットされたテキスト出力を生成するための便利なツールです。特に、テキストに変数を埋め込んだり、改行を含めたり、テキストを整列およびフォーマットしたり、変換された値を表示したりする必要がある場合に便利です。

printf構文

printfコマンドの構文は次のとおりです。

printf [-v var] format [arguments]...

注:

  • -v オプションは、結果を変数 varに保存するようにprintfに指示します。 印刷するのではなく
  • フォーマット 3つの異なる値の組み合わせを含む文字列です:
    • 逐語的に印刷される通常の文字
    • 印刷前に解釈されるバックスラッシュエスケープ文字
    • 指定され、それぞれの引数に置き換えられた変換(変数に少し似ていると考えてください)
  • 引数 形式に渡されます 定義された変換で使用されます
    • 変換指定子よりも多くの引数が形式で存在する場合 形式 文字列は、すべての引数まで繰り返されます 使用されました
    • 存在する引数が少ない場合、数値指定子はゼロに設定され、文字列指定子はnullに設定されます

printfエスケープ文字、変換、およびフラグ

printf には、無数の方法でテキストをフォーマットするために渡すことができるオプションの膨大なコレクションがあります。 以下の例は、いくつかの実用的なアプリケーションを示しています。

すべてをリストするのではなく ここでコマンドに渡すことができるオプションを使用すると、 printfの完全なユーザーマニュアルを表示できます。 次のコマンドを実行して、システムでコマンドを実行します:

man printf

printfバッシュ/シェルの例

そうですね、それで実際に何が良いのでしょうか?

数値の四捨五入された値の表示

まず、簡単なシナリオ–数値を小数点以下2桁にフォーマットして表示したい場合:

printf "%.2f" 4.21423557

これにより、次のように出力されます:

4.21

指定された形式%。2f 数値を小数点以下2桁にフォーマットするようにprintfに指示します。これは、精度を使用して行われます。 であるディレクティブ (ピリオド)形式で。

これにより、指定された小数点以下の桁数に切り捨てられるのではなく、数値が丸められます。浮動小数点数の丸めがおかしいので、出力を確認してください!

丸みを帯びた奇妙さ

この奇妙さを説明するために、次のことを考慮してください。

printf "%.2f" 4.215

4.22でしょ?違う。 printfのzsh実装 、次のように丸められます:

4.21

番号がであることを確認するには 実際には丸められているので、別の値を確認できます:

printf "%.2f" 4.216

どちらが返されますか:

4.22

…つまり、番号は printf に渡されます 丸められます。

では、なぜ 4.215の四捨五入された値が 間違っているように見えますか? 簡単に言うと、浮動小数点数です。 不正確さは、表示された値とコンピューターが計算に使用した値との不一致によって引き起こされます。

これを回避する方法はいくつかありますが、この記事の範囲外です。別の方法で説明します。

変換値(10進数、16進数、8進数)

一般的なシナリオ–別のプログラムまたはスクリプトによって提供された形式以外の形式でいくつかの数値を表示したい。 printf 変換仕様の構文を使用してこれを行うことができます:

printf "Decimal: %d\nHexadecimal: %x\nOctal: %o\n" 64 64 64

これにより、次のように出力されます:

Decimal: 64
Hexadecimal: 40
Octal: 100

番号64 フォーマッタに3回渡され、3つの異なる形式で表示されます。

きれいな出力を作成する

次の例では、 printfを使用してフォーマットされたテーブルを出力します –コメントで説明するので、何が起こっているのかが明確になります:

#/bin/bash

# Define the format for the header text
# This is a new line (\n) followed by a left-aligned string of 15 characters (%-15s), followed by a string of 15 characters (%15s), finally followed by a string of 10 characters (%10s) and another newline
header_format="\n %-15s %15s %10s\n"

# Define the format for the data in each row
# The first two entries mirror those in the header, but the final one is a bit different - a floating number with 2 decimal places(%11.2f) 
row_format=" %-15s %15s %11.2f\n"

# Use the printf command to print the header
# The format is specified, and the arguments containing the column names for the table are supplied
# printf will take the header_format, and insert the values from the attributes into it, formatted to the given specification, then print it
printf "$header_format" "CAR BRAND" "COLOUR" "TOP SPEED"

# Print the horizontal line under the table header
# Here, printf is used to print an equals symbol.  Brace expansion (the curly braces) is a shell scripting shortcut which will run the printf command for every number between 1 and 50, repeating the symbol 50 times to create a line
printf '=%.0s' {1..50}

# Print each row of data using the row_format.  Each line (indicated by a backslash and a line return) contains three values - the car brand, colour, and top speed
# Any value with a space needs to be quoted as values are separated by spaces and printf won't be able to tell where one value ends and another begins
printf "$row_format" \
Toyota Blue 100 \
Ford "Light Green" 78.3875 \
"General Motors" Purple 15.96

このスクリプトを実行すると、次のように出力されます。

CAR BRAND                COLOUR  TOP SPEED
==================================================
Toyota                     Blue      100.00
Ford                Light Green       78.39
General Motors           Purple       15.96

printfによってデータがどのようにフォーマットされているかを注意深く確認してください ここ。ヘッダーと行に特定の文字長の文字列が指定されている場合、テキストは整列します。最高速度は小数点以下2桁にフォーマットされ、正しい位置に配置されています。最初の列で指定されている場合を除いて、テキストは右揃えになります。

構文が比較的少ないため、読みにくいデータが有用な情報になりました。

空の限界

printfを使用する独自の理由を考え出します。 –スクリプト用のきれいなメニューを使用してコマンドラインインターフェイスを構築し、データベースクエリの結果を表にまとめる–これは、フォーマットされていないテキストを単にダンプするのではなく、洗練されたシェルスクリプトで誰かを感動させたい場合に特に強力なツールです。画面。

printfを組み合わせることができます Linuxの他のテキスト処理コマンドを使用します。


  1. 6 つの実用的な例を含む Bash シェル関数のチュートリアル

    Bash シェル関数は、グループに単一の名前を使用して、後で実行するために複数の UNIX / Linux コマンドをグループ化する方法です。 . Bash シェル関数は、通常の Unix コマンドと同じように実行できます。シェル関数は、それらを解釈するための新しいプロセスを作成することなく、現在のシェル コンテキストで実行されます。bash エイリアスと関数の両方を使用すると、より長い、またはより複雑なコマンドのショートカットを定義できます。ただし、エイリアスは、このチュートリアルで説明されているように、これらの関数が許可する制御フロー、引数、およびその他の巧妙なものを許可しません。 この

  2. 5 つの実用的な例を含む Bash スクリプト入門チュートリアル

    進行中の Unix Sed および Unix Awk シリーズと同様に、Bash スクリプトに関するいくつかの記事を投稿します。実用的な例ですべての bash スクリプト テクニックをカバーします。 シェルは、ユーザー コマンドを解釈するプログラムです。コマンドは、ユーザーが直接入力するか、シェル スクリプトと呼ばれるファイルから読み取るかのいずれかです。ユーザーからの入力を直接読み取る場合、シェルは対話型シェルとして呼び出されます。 シェルは、ファイルからコマンドを読み取って実行するときに、非対話型シェルとして呼び出されます。この場合、シェルはスクリプト ファイルの各行を上から下に読み取