我有一个脚本需要用千位分隔符格式化数字。于是就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
有关的: