bc
私は数学を使用して実行するスクリプトを作成しましたprintf
。
cygwin
locale isではうまく機能しますが、en_US.UTF-8
Linux(ロケール)で実行すると、小数点区切り文字en_ES.UTF-8
として使用されるため失敗します。,
たとえば、次の式は失敗します。
avg=$(printf %.2f $(echo "scale=4; $val1/$val2" | bc -l ))
解決策が見つかりました。スクリプトの前に追加してくださいLC_ALL=C.UTF8
。
LC_ALL=C.UTF8 ./script.sh [OPTIONS]
だが、私の考えにはこういうことはしないのが一番良いようだ。
だから私の質問は:ユーザープロファイルに設定されているロケールに関係なく、このような問題を回避するためにスクリプト内のロケールのみを変更する方法はありますか?
ベストアンサー1
スクリプト内で最初export LC_ALL=C.UTF-8
に1を追加するだけです(シャーバン行がある場合はすぐに次)。
その後、スクリプトによって実行されるすべてのコマンドがLC_ALL
。
ロケールの変更に影響されないスクリプトの一部が必要ですが、ロケールを尊重するためのスクリプトの一部が必要な場合(たとえば、いくつかの値を計算して印刷したい場合)、unset LC_ALL
計算後にこれを実行したい場合があります。印刷する前に。または、コマンド固有の設定でスクリプト内の特定のコマンドにのみプレフィックスを付けることを選択できます。
一部のプラットフォームでは、CロケールのUTF-8バージョンを異なってスペルします(大文字と小文字が異なる、またはハイフンがありません
UTF-8
)。よりプラットフォームに依存しないバージョンは次のとおりです。export LC_ALL=$(locale -a|grep -ix 'c.utf-\?8' || echo C)