/ bin/bash printf不适用于除C之外的其他LANG

reo*_*eox 5 bash printf locale zsh

我有一个非常奇怪的问题/ bin/bash和一个使用printf格式化字符串的脚本.

我的脚本看起来像这样

rt=$(printf "%.3f" 13.234324245)
Run Code Online (Sandbox Code Playgroud)

差异,我计算数字13.23 ...以上.当我使用/ usr/bin/zsh时效果很好!偶然/ bin/sh可以做到(但它不能做if if ...)最大的问题是/ bin/bash似乎不理解printf或者当我不使用时确实有另一种格式化方式LANG=C.

我的LANG变量设置为de_AT.UTF-8然后我得到此错误:

/path/to/script: Zeile 12: printf: 13.234324245: Ungültige Zahl.
Run Code Online (Sandbox Code Playgroud)

所以它只是说我给printf的数字无效......

我需要以不同的方式运行printf吗?

编辑:问题似乎是在计算数字:

rt=$(printf "%.3f" $(echo "$res2 - $res1"|bc ))
Run Code Online (Sandbox Code Playgroud)

我怎么能告诉bc使用a ,而不是.

Gil*_*il' 5

你的问题源于LC_NUMERIC设置,在解析参数时bash遵循printf.

我发现这种行为可疑.Ksh93还根据LC_NUMERICpdksh和dash想要一个点作为参数中的分隔符来解析数字,并且zsh接受点或本地格式.POSIX没有说,因为指定的浮点格式是可选的printf(LC_NUMERIC虽然打印数字时必须遵守).

作为一个用户,我建议永远不要设置LC_NUMERIC,LC_COLLATE除非在非常具体的情况下,你确定你想要他们的行为.这意味着不使用LANG和设置特定类别; 大多数人只需要LC_CTYPE(字符编码),LC_MESSAGES(消息语言)和LC_TIME(日期和时间格式).在脚本中,您可以通过设置覆盖所有类别LC_ALL,或通过设置LANG覆盖特定类别(仅设置覆盖$LANG而不是用户设置$LC_NUMERIC).

#!/bin/sh
LC_NUMERIC=C LC_COLLATE=C
printf "%.3f" 13.234324245
Run Code Online (Sandbox Code Playgroud)