[완료] bash shell에서 큰단위숫자의 연산과 표현에 대하여
안녕하세요.
bash shell에서 ip를 long으로 바꿔 계산하는 스크립트를 작성하였습니다.
#------------- 스크립트 소스 내용 -----------------
divide_value "$172.20.1.1"
#divide_value에서 설정되는 변수는 $DIVIED_ARRAY 입니다.
#$DIVIED_ARRAY에 점(.)을 제외한 숫자만 할당됩니다.
#이 스크립트에서는 172 20 1 1 의 숫자4개가 $DIVIED_ARRAY에 할당됩니다.
LONG_VALUE=0
for n in ${DIVIDE_ARRAY}; do
LONG_VALUE=`expr ${LONG_VALUE} \* 256 + ${n}`
done
echo $LONG_VALUE
#-------------------------------------------------
fedora10이 설치된 pc에서 실행을 시켜보니
2886992128 가 $LONG_VALUE에 할당되어 2886992128가 정상적으로 출력되었습니다.
(계산결과는 경우에 따라 최대 4294967295 가 나올수 있습니다)
그래서 이 내용을 가지고 그대로 arm칩을 쓰는 보드에서 실행시켜보니
2.88699e+09 가 출력되었습니다.
나온값을 가지고 연산을 해야 하는데 값이 x.xxx+xx 로 나와서 연산이 제대로 되질 않고 있습니다.
pc쪽에서는 제대로 출력(몇 연산)이 되어 문제가 없는데, 보드쪽에서는 제대로 출력이 되질 않네요.
bash 버젼은 pc쪽은 4.0.23 , 보드쪽은 4.1.7 입니다.
궁금한것은 bash shell에서 변수의 표현가능한 범위는 고정되어 있다고 들었는데,
양쪽의 출력 결과가 다른이유가 궁금합니다.
(혹시, 변수에 관한 bash 설정파일이 따로 있는지...)
그리고, 큰수에 대한(연산결과가 최대 4294967295) 좋은 연산방법이 있는지도 알고 싶습니다.
bash shell에서 정수변수는 singned long(32bit)형이라서 (표현범위는 -2147483648에서2147483647)
라는 자료가보이던데, 정수변수형을 어떻게 바꿀수 있는 방법은 없는지도 알고 싶습니다.
간단한 조언이라도 좋으니 답변 부탁드립니다.
읽어주셔서 감사합니다.
찾아보았더니 busybox menuconfig 쪽에
찾아보았더니 busybox menuconfig 쪽에 다음과 같은 옵션이 선택 되어 있지 않았네요.
CONFIG_EXPR_MATH_SUPPORT_64=y
CONFIG_SH_MATH_SUPPORT_64=y
선택후 busybox를 재컴파일후 올려보았는데도 마찬가지네요.
음... 뭔가 다른 옵션 추가로 더설정해 주어야 하는듯 합니다.
아시는분 있으시면 답변부탁드립니다.
에궁... 좀더 이것저것
에궁... 좀더 이것저것 삽질해봤더니
busybox설정에서
CONFIG_EXPR_MATH_SUPPORT_64=y
CONFIG_SH_MATH_SUPPORT_64=y
옵션 선택해주고 한건 제대로 선택한거 였었네요.
문제는 awk쓰는 부분이 있는데, awk결과에서 생긴 문제였습니다.
위의 옵션 체크후 실행해보니 expr 결과값이 제대로 나오지만 그값을 awk로 넘겨서
awk에서 가공을 하니 문제가 생겼습니다.
BBB=`echo ${TMP} | awk '{print and($1, $B)}'`
busybox config에서 awk옵션쪽 찾아보았으나 support 64같은 부분이 없더군요.
혹시 아시는분 있으시면 답변부탁드립니다.
awk쪽 연산을 $((xx))로 바꿔서 어떻게든 되긴
awk쪽 연산을 $((xx))로 바꿔서 어떻게든 되긴 됐네요;
댓글 달기