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