カスタム IFS は printf 形式を変更します。

カスタム IFS は printf 形式を変更します。

千単位の区切り文字を使用して数値書式を指定する必要があるスクリプトがあります。だから1234567それは1,234,567。私はそれを使用してprintf "%'d" 1234567結果を得ます。うまくいきます。スクリプトの後半でIFS=","文字列ペアテーブルを処理するためのカスタマイズを設定しました。その後、この機能を使用すると、printf "%'d"カンマではなく空白が表示されます。IFSデフォルト値にリセットすると、期待printfどおりに動作します。IFSprintf形式に影響を与えるのはなぜですか?

答え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

関連:

関連情報