Bash (Yad) usando números de ponto flutuante em vez de números inteiros

Bash (Yad) usando números de ponto flutuante em vez de números inteiros

Eu escrevi essa festaroteiroque executa vários temporizadores. O problema é que meu array armazena números inteiros:

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

Mas o do outro usuário LC_NUMERICestá configurado como it_IT.UTF-8e seu array bash é muito diferente:

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

Isso faz com que meu script seja interrompido ao testar se uma entrada do array é maior que zero:

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

Testes de linha de comando

Esses testes podem confirmar o que o bash está "pensando":

$ 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

Outras informações

Tentei (via chat) fazer com que outro usuário usasse export LC_ALL=Ce exportasse LC_NUMERIC="en_US.UTF-8"tudo sem sucesso.

Como o bash pode ser forçado a usar números inteiros (inteiros)?


Solução

O problema era o YAD (Yet Another Dialog) armazenar números com precisão decimal na Itália, mas não na América do Norte. A solução foi usar:

    # 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"

Responder1

E quanto a isso:

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

informação relacionada