.png)
나는이 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,000000|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