2014-03-24 4 views
0

쉘 스크립트의 변수에 긴 값을 할당하고 일부 계산을 시도하지만 음수 기호가있는 결과가 나타납니다.긴 숫자의 최상위 비트가 쉘 스크립트에서 잘립니다.

128 20 
    -1280 20 
    -2688 21 
    -4096 20 

나는 그것이 숫자를 잘라하지 않도록 긴 부호 사용하는 쉘 스크립트를 말할 수 없다 :

count=4 
    initial_value=128 
    final_value=18446744073709547520 
    step=$((($final_value - $initial_value)/($count - 1))) 
    value=$initial_value 
    for((i=1; i<=count; i++)) 
    do 
    START=`date +%s` 
    myvariable=$(mysql $database -u $user -se "SET GLOBAL join_buffer_size = $value;query to run") 
    END=`date +%s` 
    TIME=`echo "$END - $START" | bc` 
    echo "$value $TIME" >> output.txt 
    value=$(($value+$step)) 
    mysqld restart 
    done 

내 경우 output.txt 파일의 출력

이입니다. 어떻게 해결할 수 있습니까? 감사합니다

답변

2

귀하의 $final_value은 bash 연산 (9223372036854775807)의 최대 정수보다 큽니다. 대신 bc를 사용

count=4 
initial_value=128 
final_value=18446744073709547520 
step=$(echo "($final_value - $initial_value)/($count - 1)") 
value=$initial_value 
for((i=1; i<=count; i++)) 
do 
START=$(date +%s) 
myvariable=$(mysql $database -u $user -se "SET GLOBAL join_buffer_size = $value;query to run") 
END=$(date +%s) 
TIME=$(echo "$END - $START" | bc) 
echo "$value $TIME" >> output.txt 
value=$(echo "$value+$step" | bc) 
mysqld restart 
done 

샘플 출력 (내 사본에서 MySQL의 명령을 제거) :

128 0 
6148914691236515925 0 
12297829382473031722 0 
18446744073709547519 0