Bash内置printf处理浮点数异常问题求助
问题原因及解决办法
根本原因
问题出在locale的数值格式差异。你使用的英国UK locale(如en_GB.UTF-8)中,小数点分隔符是逗号(,)而非点号(.)。bash的内置printf会严格遵循当前locale的数值解析规则,当传入以点号作为小数点的数值时,它无法识别为有效浮点数,因此输出-nan或错误的超大数值;而/bin/printf属于GNU coreutils组件,其浮点数解析逻辑不严格依赖locale的小数点设置,所以能正常处理点号分隔的数值。
解决办法
临时切换locale执行printf:在调用bash内置
printf时,临时将LC_NUMERIC设置为C(POSIX标准locale,小数点为点号),即可正确解析数值:[ -n "$EF" ] && LC_NUMERIC=C printf "energy_full: %0.2f Wh\n" "$EF"也可以在脚本开头全局设置,避免后续其他命令出现类似问题:
#!/bin/bash LC_NUMERIC=C # 后续脚本内容...直接使用外部printf命令:既然
/bin/printf能正常工作,直接替换内置printf为外部命令即可,无需修改locale:[ -n "$EF" ] && /bin/printf "energy_full: %0.2f Wh\n" "$EF"调整bc输出适配UK locale:若要保持locale不变,可让bc输出使用逗号作为小数点,不过这种方式相对繁琐:
EF=$(echo "scale=3; $(cat /sys/class/power_supply/BAT0/energy_full)/1000000" | bc -l | sed 's/\./,/') [ -n "$EF" ] && printf "energy_full: %0.2f Wh\n" "$EF"
内容的提问来源于stack exchange,提问作者JFBonzo
相关产品推荐
相关产品推荐

