Bash(Yad) は整数の代わりに浮動小数点を使用します。

Bash(Yad) は整数の代わりに浮動小数点を使用します。

私はこのbashを書いたスクリプト複数のタイマーを実行します。問題は、私の配列が整数を格納することです。

|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

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

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

おすすめ記事