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

这会导致我的脚本在测试数组条目是否大于零时中断:

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

相关内容