%20verwendet%20Gleitkommazahlen%20anstelle%20von%20ganzen%20Zahlen%20.png)
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_NUMERIC
Aber das Setup des anderen Benutzers it_IT.UTF-8
ist 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,000000|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=C
und 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