我制作了一个脚本来做一些数学运算,使用bc和printf。
它在cygwin哪个区域设置下运行良好en_US.UTF-8,但是当我在 linux 下运行它时,哪个区域设置是en_ES.UTF-8,它失败了,因为它,用作十进制分隔符。例如下一个表达式失败:
avg=$(printf %.2f $(echo "scale=4; $val1/$val2" | bc -l ))
Run Code Online (Sandbox Code Playgroud)
我找到了解决方案。在脚本之前LC_ALL=C.UTF8:
LC_ALL=C.UTF8 ./script.sh [OPTIONS]
Run Code Online (Sandbox Code Playgroud)
但是,我认为最好不要这样做。
所以,我的问题是:有没有办法只在脚本内部更改语言环境,以避免此类问题,而不管用户配置文件中设置的语言环境如何?
Tob*_*ght 12
在脚本内部,只需export LC_ALL=C.UTF-8在开头 ¹(就在 shebang 行之后,如果有的话)。
然后,脚本执行的所有命令都将继承LC_ALL.
如果您需要脚本的一部分不受区域设置更改的影响,但部分需要尊重区域设置(例如,如果您要计算然后打印一些值),您可能需要unset LC_ALL在计算之后和打印之前进行。或者,您可以选择在脚本中仅使用每个命令设置为某些命令添加前缀。
某些平台以不同方式拼写 C 语言环境的 UTF-8 版本(不同的大小写和/或在 中缺少连字符UTF-8)。更独立于平台的版本是:
export LC_ALL=$(locale -a|grep -ix 'c.utf-\?8' || echo C)
Run Code Online (Sandbox Code Playgroud)