%20%E3%81%8C%E6%95%B4%E6%95%B0%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%20.png)
このバッシュを書いたのは脚本複数のタイマーを実行します。問題は、配列に整数が格納されていることです。
|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
これにより、配列エントリがゼロより大きいかどうかをテストするときにスクリプトが中断されます。
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