在脚本中更改语言环境

Alb*_*ert 8 bash locale

我制作了一个脚本来做一些数学运算,使用bcprintf

它在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在计算之后和打印之前进行。或者,您可以选择在脚本中仅使用每个命令设置为某些命令添加前缀。


  1. 某些平台以不同方式拼写 C 语言环境的 UTF-8 版本(不同的大小写和/或在 中缺少连字符UTF-8)。更独立于平台的版本是:

     export LC_ALL=$(locale -a|grep -ix 'c.utf-\?8' || echo C)
    
    Run Code Online (Sandbox Code Playgroud)