千単位の区切り文字を使用して数値書式を指定する必要があるスクリプトがあります。だから1234567
それは1,234,567
。私はそれを使用してprintf "%'d" 1234567
結果を得ます。うまくいきます。スクリプトの後半でIFS=","
文字列ペアテーブルを処理するためのカスタマイズを設定しました。その後、この機能を使用すると、printf "%'d"
カンマではなく空白が表示されます。IFS
デフォルト値にリセットすると、期待printf
どおりに動作します。IFS
printf形式に影響を与えるのはなぜですか?
答え1
したがって、おそらくそのようなことが起こっているか、それと同じようなことがあります(たとえば、POSIXではなくロケールを使用している場合en_US.UTF-8
)。重要なことは、次のように使用すると引用がないことです$var
。
$ printf "%'d\n" 1234567
1,234,567
$ var=$(printf "%'d\n" 1234567)
$ echo $var
1,234,567
$ IFS=,
$ echo $var
1 234 567
変数は$var
引用符なしで使用されるため、シェルは変数の値をの文字に分割して各引数$IFS
に対して別々の引数を生成します(シェルは生成された単語ごとにファイル名のグロービングも実行しますが、ここでは実行されません。では問題があります)。ユーティリティecho
は、引数の間にスペースがあり、末尾に改行文字がある引数を印刷します。
引用された変数の拡張とコマンドの置き換えが必要です。以下に、次のコマンドを使用して「変数として印刷する」方法も示しますprintf
。
$ printf -v var "%'d" 1234567
$ printf '%s\n' "$var"
1,234,567
$ IFS=,
$ printf '%s\n' "$var"
1,234,567
関連: