/bin/bash printf 不适用于 C 以外的其他 LANG
我对 /bin/bash 和使用 printf 格式化字符串的脚本有一个非常奇怪的问题。
我的脚本看起来像这样
rt=$(printf "%.3f" 13.234324245)
,但不同之处在于我计算了上面的数字 13.23...。当我使用 /usr/bin/zsh 时效果很好!甚至 /bin/sh 也可以做到(但它不能做 if 的东西......) 最大的问题是 /bin/bash 似乎不理解 printf 或者当我不使用 LANG=C
时确实有另一种格式化方式。
我的 LANG 变量设置为 de_AT.UTF-8
然后我收到此错误:
/path/to/script: Zeile 12: printf: 13.234324245: Ungültige Zahl.
所以它只是说我给 printf 的数字无效...
我需要以不同的方式运行 printf ?
编辑:问题似乎在于数字的计算:
rt=$(printf "%.3f" $(echo "$res2 - $res1"|bc ))
我如何告诉 bc 使用 ,
而不是 .
?
I have a really weird problem with /bin/bash and a script that uses printf to format a string.
My script looks like this
rt=$(printf "%.3f" 13.234324245)
with the difference, that i compute the number 13.23... above. When i use /usr/bin/zsh that works great! Even /bin/sh can do it (but it cant do the if stuff...)
The biggest problem ist that /bin/bash seems to does not understand printf or does have another formating way when i dont use LANG=C
.
My LANG Variable is set to de_AT.UTF-8
and then i get this Error:
/path/to/script: Zeile 12: printf: 13.234324245: Ungültige Zahl.
So it simply says that the number i gave printf is invalid...
Do i need to run printf in a different way?
edit: The problem seems to be on the computation of the number:
rt=$(printf "%.3f" $(echo "$res2 - $res1"|bc ))
how i can tell bc to use a ,
instead of .
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您的问题源于
LC_NUMERIC
设置,bash 在解析printf
参数时遵循该设置。我觉得这种行为很可疑。 Ksh93 还根据 LC_NUMERIC 解析数字,而 pdksh 和 dash 需要一个点作为参数中的分隔符,而 zsh 接受点或本地格式。 POSIX 没有说,因为指定的浮点格式是可选的
printf
(但在打印数字时必须遵守LC_NUMERIC
)。作为用户,我建议永远不要设置
LC_NUMERIC
和LC_COLLATE
,除非在非常特定的情况下,您确定需要它们的行为。这意味着不使用LAN
而是设置特定类别;大多数人只需要LC_CTYPE
(字符编码)、LC_MESSAGES
(消息语言)和LC_TIME
(日期和时间格式)。在脚本中,您可以通过设置LC_ALL
覆盖所有类别,也可以通过设置特定类别(设置LANG
仅覆盖$LANG
而不会覆盖用户设置的$LC_NUMERIC
)。Your problem stems for the
LC_NUMERIC
setting, which bash follows when parsing arguments toprintf
.I find this behavior dubious. Ksh93 also parses numbers according to
LC_NUMERIC
while pdksh and dash want a dot as the separator in the argument, and zsh accepts either a dot or the local format. POSIX doesn't say, because the floating point format specified are optional inprintf
(LC_NUMERIC
must be respected when printing numbers though).As a user I recommend never setting
LC_NUMERIC
andLC_COLLATE
except in very specific circumstances where you're sure you want their behavior. This means not usingLANG
and setting specific categories instead; most people only needLC_CTYPE
(character encoding),LC_MESSAGES
(language of messages) andLC_TIME
(date and time format). In a script, you can override all categories by settingLC_ALL
, or a specific category by setting it (settingLANG
only overrides$LANG
and not a user-set$LC_NUMERIC
).只需执行
$(LANG=C printf "%.3f" 13.234324245)
,只需在此命令上设置LANG
Just do a
$(LANG=C printf "%.3f" 13.234324245)
, just setLANG
on this command这可能是一个区域设置问题 - 我认为在德语中,小数点分隔符是逗号
,
而不是句点.
。尝试使用13,234324245
作为您的值。It's probably a locale issue - I think that in German the decimal separator is comma
,
rather than period.
. Try using13,234324245
as your value.您可以使用其他
printf
实现: 使用非内置 /usr/bin/printf:使用
zsh
内置 printf 实现:You can use other
printf
implementations: with non-builtin /usr/bin/printf:With
zsh
built-in printf implementation: