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 ,而不是.?
你的问题源于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)
| 归档时间: |
|
| 查看次数: |
3591 次 |
| 最近记录: |