Bash (Yad) が整数の代わりに浮動小数点数を使用する

Bash (Yad) が整数の代わりに浮動小数点数を使用する

このバッシュを書いたのは脚本複数のタイマーを実行します。問題は、配列に整数が格納されていることです。

|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1

しかし、他のユーザーのLC_NUMERIC設定は次のようになっておりit_IT.UTF-8、その bash 配列は大きく異なります。

1,000000|0,000000|0,000000|0,000000|0,000000|0,000000|0,000000|0,000000|0,000‌​000|0,000000|0,000000|0,000000|0,000000|0,000000|0,000000|0,000000|1,000000

これにより、配列エントリがゼロより大きいかどうかをテストするときにスクリプトが中断されます。

iActiveTimersCount=0
for ((i=0; i<MAX_TIMERS; i++)); do
    if [[ ${aDuration[i]} -gt 0 ]] ; then
        (( iActiveTimersCount++ ))
        iAllTimersSaveSec=$(( iAllTimersSaveSec + ${aDuration[i]} ))
    fi
done

コマンドラインテスト

これらのテストにより、bash が「考えていること」を確認できます。

$ if [[ 30,000000 -gt 0 ]]; then echo TRUE ; else echo FALSE ; fi
FALSE

$ if [[ 30.000000 -gt 0 ]]; then echo TRUE ; else echo FALSE ; fi
bash: [[: 30.000000: syntax error: invalid arithmetic operator (error token is ".000000")
FALSE

他の情報

export LC_ALL=C他のユーザーに(チャット経由で)使用させてすべてをエクスポートしてもらおうとしましたが、LC_NUMERIC="en_US.UTF-8"うまくいきませんでした。

bash で強制的に整数を使用するにはどうすればよいでしょうか?


解決

問題は、YAD (Yet Another Dialog) がイタリアでは小数点精度で数値を保存しているのに、北米では保存していないことでした。解決策は、次のものを使用することでした。

    # When LC_NUMERIC=it_IT-UTF8 30 seconds can be `30,000000` or
    # `30.000000` which breaks bash tests for `-gt 0`.
    # Search and replace ".000000" or ",000000" to null
    sed -i 's/[,.]000000//g' "$res1"
    sed -i 's/[,.]000000//g' "$res2"

答え1

これはどうですか:

iActiveTimersCount=0
for ((i=0; i<MAX_TIMERS; i++)); do
    dur=$(awk -F, '{print $1}' <<<"${aDuration[i]}")
    if [[ $dur -gt 0 ]] ; then
        (( iActiveTimersCount++ ))
        iAllTimersSaveSec=$(( iAllTimersSaveSec + dur ))
    fi
done

関連情報