Bash (Yad) verwendet Gleitkommazahlen anstelle von ganzen Zahlen

Bash (Yad) verwendet Gleitkommazahlen anstelle von ganzen Zahlen

Ich habe diese Bash geschriebenSkriptdas mehrere Timer ausführt. Das Problem ist, dass mein Array ganze Zahlen speichert:

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

LC_NUMERICAber das Setup des anderen Benutzers it_IT.UTF-8ist ganz anders und sein Bash-Array unterscheidet sich:

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

Dies führt dazu, dass mein Skript beim Testen, ob ein Array-Eintrag größer als Null ist, abbricht:

iActiveTimersCount=0
for ((i=0; i<MAX_TIMERS; i++)); do
    if [[ ${aDuration[i]} -gt 0 ]] ; then
        (( iActiveTimersCount++ ))
        iAllTimersSaveSec=$(( iAllTimersSaveSec + ${aDuration[i]} ))
    fi
done

Befehlszeilentests

Diese Tests können bestätigen, was Bash „denkt“:

$ 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

Andere Information

Ich habe (über den Chat) versucht, andere Benutzer dazu zu bringen, alles zu verwenden export LC_ALL=Cund zu exportieren LC_NUMERIC="en_US.UTF-8", aber ohne Erfolg.

Wie kann Bash gezwungen werden, ganze Zahlen (Integer) zu verwenden?


Lösung

Das Problem war, dass YAD (Yet Another Dialog) Zahlen in Italien mit Dezimalgenauigkeit speicherte, in Nordamerika jedoch nicht. Die Lösung bestand in der Verwendung von:

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

Antwort1

Wie wärs damit:

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

verwandte Informationen