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
%s
divider
perl -e 'print "=" x 55, "\n"'
フィールド幅指定子の最も単純な形式は整数です。これを行うには、printf
少なくともこれと同じ文字を使用して印刷する必要があります。その引数が印刷するのにこの数より少ない文字が必要な場合、出力の左側にスペースが埋められます。
精度指定子の最も単純な形式は、ドットの後に整数が続くことです。に適用すると、%s
印刷する文字の最大数を設定します。 (数値型によって意味が異なります。)
コメントに応じてシェル変数の拡張についても説明します(完全な説明は、bashドキュメントで「パラメータ拡張」を検索することで見つけることができます。$VAR対${VAR}と引用):
変数(たとえば
x
)が設定されると、$x
値が拡張されますx
。値にスペースが含まれている場合は、複数の単語に展開されます。そのため、上記のコードでは二重"$format"
引用符などが重要です。これは単一の単語に展開されます(そうでない場合は、文字列形式全体を受け取るのではなく、最初の引数、printf
後%-15s
に引数などが表示されます)。%8s
単一パラメータ)。上記の例では、単に変数を拡張する
${x}
代わりに書き込みを許可します。これは、変数を作成すると、bashが設定されていない変数の値を取得しようとするとnull拡張が発生するためです。$x
x
"${width}s"
"$widths"
widths