%20usando%20n%C3%BAmeros%20de%20punto%20flotante%20en%20lugar%20de%20n%C3%BAmeros%20enteros%20.png)
Escribí esta fiestaguionque ejecuta varios temporizadores. El problema es que mi matriz almacena números enteros:
|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1
Pero el otro usuario LC_NUMERIC
está configurado it_IT.UTF-8
y su matriz bash es muy 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
Esto hace que mi script se rompa al probar si una entrada de matriz es mayor que cero:
iActiveTimersCount=0
for ((i=0; i<MAX_TIMERS; i++)); do
if [[ ${aDuration[i]} -gt 0 ]] ; then
(( iActiveTimersCount++ ))
iAllTimersSaveSec=$(( iAllTimersSaveSec + ${aDuration[i]} ))
fi
done
Pruebas de línea de comando
Estas pruebas pueden confirmar qué está "pensando" 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
Otra información
Intenté (a través del chat) que otro usuario usara export LC_ALL=C
y exportara LC_NUMERIC="en_US.UTF-8"
todo sin éxito.
¿Cómo se puede obligar a bash a utilizar números enteros (enteros)?
Solución
El problema era que YAD (Yet Another Dialog) almacenaba números con precisión decimal en Italia pero no en Norteamérica. La solución fue utilizar:
# 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"
Respuesta1
¿Qué pasa con esto?
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