Bash (Yad) usando números de punto flotante en lugar de números enteros

Bash (Yad) usando números de punto flotante en lugar de números enteros

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_NUMERICestá configurado it_IT.UTF-8y su matriz bash es muy 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

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=Cy 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

información relacionada