%20usando%20n%C3%BAmeros%20de%20ponto%20flutuante%20em%20vez%20de%20n%C3%BAmeros%20inteiros%20.png)
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_NUMERIC
está configurado como it_IT.UTF-8
e seu array bash é muito diferente:
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
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=C
e 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