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

0

Eu escrevi esse script da bash que executa vários temporizadores. O problema é que minha matriz armazena números inteiros:

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

Mas o LC_NUMERIC do outro usuário é configurado como it_IT.UTF-8 e o 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 de matriz é 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

Estes 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

Eu tentei (via chat) fazer com que outro usuário usasse export LC_ALL=C e exportar LC_NUMERIC="en_US.UTF-8" all 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), que armazenava 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"
    
por WinEunuuchs2Unix 02.06.2018 / 22:48

1 resposta

1

E sobre 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
    
por 02.06.2018 / 22:56