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

관련 정보