[완료] bash shell에서 큰단위숫자의 연산과 표현에 대하여

song0369의 이미지

안녕하세요.

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)
라는 자료가보이던데, 정수변수형을 어떻게 바꿀수 있는 방법은 없는지도 알고 싶습니다.

간단한 조언이라도 좋으니 답변 부탁드립니다.

읽어주셔서 감사합니다.

song0369의 이미지

찾아보았더니 busybox menuconfig 쪽에 다음과 같은 옵션이 선택 되어 있지 않았네요.
CONFIG_EXPR_MATH_SUPPORT_64=y
CONFIG_SH_MATH_SUPPORT_64=y

선택후 busybox를 재컴파일후 올려보았는데도 마찬가지네요.

음... 뭔가 다른 옵션 추가로 더설정해 주어야 하는듯 합니다.

아시는분 있으시면 답변부탁드립니다.

song0369의 이미지

에궁... 좀더 이것저것 삽질해봤더니

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같은 부분이 없더군요.

혹시 아시는분 있으시면 답변부탁드립니다.

song0369의 이미지

awk쪽 연산을 $((xx))로 바꿔서 어떻게든 되긴 됐네요;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.