정수 대신 부동 소수점 숫자를 사용하는 Bash(Yad)

정수 대신 부동 소수점 숫자를 사용하는 Bash(Yad)

나는이 bash를 썼다스크립트여러 개의 타이머를 실행합니다. 문제는 내 배열이 정수를 저장한다는 것입니다.

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

그러나 다른 사용자는 LC_NUMERIC다음과 같이 설정되어 it_IT.UTF-8있으며 bash 배열은 매우 다릅니다.

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

이로 인해 배열 항목이 0보다 큰지 테스트할 때 스크립트가 중단됩니다.

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

명령줄 테스트

이 테스트를 통해 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

기타 정보

export LC_ALL=C나는 (채팅을 통해) 다른 사용자가 모든 것을 사용 하고 내보내도록 시도했지만 LC_NUMERIC="en_US.UTF-8"아무 소용이 없습니다.

Bash가 어떻게 정수(정수)를 사용하도록 강제할 수 있나요?


해결책

문제는 YAD(Yet Another Dialog)가 이탈리아에서는 소수점 정밀도로 숫자를 저장하지만 북미에서는 그렇지 않다는 것입니다. 해결책은 다음을 사용하는 것이었습니다.

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

답변1

이것은 어떻습니까?

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

관련 정보