web-dev-qa-db-ja.com

スクリプトのロケールを変更する

bcprintfを使用して、計算を行うスクリプトを作成しました。

それはen_US.UTF-8であるcygwinの下でうまく機能しましたが、en_ES.UTF-8であるLinuxで実行すると、小数点記号として,を使用しているため失敗します。たとえば、次の式は失敗します。

avg=$(printf %.2f $(echo "scale=4; $val1/$val2" | bc -l )) 

解決策を見つけました。スクリプトの前にLC_ALL=C.UTF8を付けます。

LC_ALL=C.UTF8 ./script.sh [OPTIONS] 

でも、やらない方がいいと思います。
だから、私の質問:ユーザープロファイルで設定されたロケールに関係なく、このような問題を回避するために、スクリプト内でのみロケールを変更する方法はありますか?

6
Albert

スクリプト内では、最初に(もしあれば、シバン行の直後に)単にexport LC_ALL=C.UTF-8を入力します。

(Cygwinの場合、代わりにexport LC_ALL=c.utf8が必要になる場合があります。)

次に、スクリプトによって実行されるすべてのコマンドはLC_ALLを継承します。

スクリプトの一部がロケールの変更に影響されないようにするが、ロケールを尊重する必要がある場合(たとえば、計算してから一部の値を出力する場合)、計算後と前にunset LC_ALLが必要になる場合があります。印刷。または、スクリプト内の一部のコマンドの前にコマンドごとの設定を付けることもできます。

10
Toby Speight