可変型を使用したPrintfの書式設定 - このvarは何を参照しますか?

可変型を使用したPrintfの書式設定 - このvarは何を参照しますか?

Bashでprintf形式を試していますが、次のコードを見つけました。

#/bin/bash
divider===============================
divider=$divider$divider

header="\n %-15s %8s %10s %11s\n"
format=" %-15s %08d %10s %11.2f\n"
width=55

printf "$header" "ITEM NAME" "ITEM ID" "COLOR" "PRICE"

printf "%$width.${width}s\n" "$divider"

printf "$format" \
Triangle 13  red 20 \
Oval 204449 "dark blue" 65.656 \
Square 3145 orange .7

私が興味のある行は次のとおりです。

printf "%$width.${width}s\n" "$divider"

この変数参照は何をしていますか?どういう意味ですか?

ベストアンサー1

このコードは、"%$width.${width}s\n"次に使用するのに適した書式文字列を生成します。printf

公開されたスクリプトからwidth値が割り当てられているので、55両方$widthとも${width}bashが次に展開されます55。の完全な最初の引数は、フィールド幅と精度指定子を使用して正確に55文字を印刷する必要がある形式です。printfに拡張されます。 。現在の変数値が与えられると、これは単に55の等号で構成される1行を印刷します。同じ内容を印刷するより簡単な方法はです。%55.55s\n%sdividerperl -e 'print "=" x 55, "\n"'

フィールド幅指定子の最も単純な形式は整数です。これを行うには、printf少なくともこれと同じ文字を使用して印刷する必要があります。その引数が印刷するのにこの数より少ない文字が必要な場合、出力の左側にスペースが埋められます。

精度指定子の最も単純な形式は、ドットの後に整数が続くことです。に適用すると、%s印刷する文字の最大数を設定します。 (数値型によって意味が異なります。)

コメントに応じてシェル変数の拡張についても説明します(完全な説明は、bashドキュメントで「パラメータ拡張」を検索することで見つけることができます。$VAR対${VAR}と引用):

  • 変数(たとえばx)が設定されると、$x値が拡張されますx。値にスペースが含まれている場合は、複数の単語に展開されます。そのため、上記のコードでは二重"$format"引用符などが重要です。これは単一の単語に展開されます(そうでない場合は、文字列形式全体を受け取るのではなく、最初の引数、printf%-15sに引数などが表示されます)。%8s単一パラメータ)。

  • 上記の例では、単に変数を拡張する${x}代わりに書き込みを許可します。これは、変数を作成すると、bashが設定されていない変数の値を取得しようとするとnull拡張が発生するためです。$xx"${width}s""$widths"widths

おすすめ記事