私はこの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,000000|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