自定义 IFS 更改了 printf 格式

自定义 IFS 更改了 printf 格式

我有一个脚本需要用千位分隔符格式化数字。于是就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不加引号使用,因此 shell 会在 中的字符上拆分变量的值$IFS,从而为每个参数创建单独的参数(shell 还会对每个生成的单词执行文件名通配,但这在本例中不是问题)。该echo实用程序将打印其参数,参数之间有空格,末尾有换行符。

您需要引用变量的扩展和命令替换。下面,我还展示了如何使用以下命令“打印到变量” printf

$ printf -v var "%'d" 1234567
$ printf '%s\n' "$var"
1,234,567
$ IFS=,
$ printf '%s\n' "$var"
1,234,567

有关的:

相关内容