나는이 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