bc
とprintf
を使用して、計算を行うスクリプトを作成しました。
それは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]
でも、やらない方がいいと思います。
だから、私の質問:ユーザープロファイルで設定されたロケールに関係なく、このような問題を回避するために、スクリプト内でのみロケールを変更する方法はありますか?
スクリプト内では、最初に(もしあれば、シバン行の直後に)単にexport LC_ALL=C.UTF-8
を入力します。
(Cygwinの場合、代わりにexport LC_ALL=c.utf8
が必要になる場合があります。)
次に、スクリプトによって実行されるすべてのコマンドはLC_ALL
を継承します。
スクリプトの一部がロケールの変更に影響されないようにするが、ロケールを尊重する必要がある場合(たとえば、計算してから一部の値を出力する場合)、計算後と前にunset LC_ALL
が必要になる場合があります。印刷。または、スクリプト内の一部のコマンドの前にコマンドごとの設定を付けることもできます。