加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 17:04:08 所属栏目:安全 来源:网络整理
导读:我有一个非常奇怪的问题/ bin / bash和一个使用printf格式化字符串的脚本. 我的脚本看起来像这样 rt=$(printf "%.3f" 13.234324245) 差异,我计算数字13.23 …以上.当我使用/usr/bin/zsh时效果很好!偶数/ bin / sh可以做到(但它不能做if if ……) 最大的问题
我有一个非常奇怪的问题/ bin / bash和一个使用printf格式化字符串的脚本.

我的脚本看起来像这样

rt=$(printf "%.3f" 13.234324245)

差异,我计算数字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.

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

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

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

rt=$(printf "%.3f" $(echo "$res2 - $res1"|bc ))

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

您的问题源于LC_NUMERIC设置,在解析printf的参数时会出现bash.

我发现这种行为可疑. Ksh93还根据LC_NUMERIC解析数字,而pdksh和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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读