Bash数量限制?

11 linux bash numbers

我之前问过一个问题,涉及从文本文件中提取大质数并将它们放入另一个文件中.它应该在2 ^ 32之后获取每个素数并包括第一个素数,并且由于某种原因,这个脚本停止工作.

#!/bin/bash
n=4294967296
last=0
while read number
    do
    if [ $last -gt $n ]
    then break
    fi
    echo $number
last=$number
done < primes.txt > primes2.txt
Run Code Online (Sandbox Code Playgroud)

最终循环遍历这11个数字:

4232004449  
4232004479  
4232004493  
4232004509  
4232004527  
4232004533  
4232004559  
4232004589  
4232004593  
4232004613  
004437
Run Code Online (Sandbox Code Playgroud)

原始文件没有004437,我的bash将处理数字8999999999999999999

有没有人知道为什么会这样?

64位Ubuntu 10.04,16GB内存,8核@ 3.60 GHz
GNU bash,版本4.1.5(1)-release(x86_64-pc-linux-gnu)

更新:

下载并编译jfgagne提供的"fixed"bash并在我的bash脚本中链接到它后,它在同一个位置出错了.使用来自我原始主要问题的明显更快的perl等价物,我从ls -al获得了一些文件大小:

        11  next_prime (just to make sure this was counting bytes accurately)
2147483659  primes2.txt
2147483670  one_too_many
Run Code Online (Sandbox Code Playgroud)

2147483659 = 2 ^ 31 + 11

下一个prime(4232004631)的大小是11个字节.它保存所有素数4232004613.我也意识到这004437是来自这个错误循环底部的素数结束(4232004437).看起来有些东西正试图推进,但卡住了.

pet*_*ica 5

不,它独立于您的操作系统的比特.它取决于bash源中的一个简单声明.

从2002年左右开始,这个声明是__int64_t.从那时起,bash版本> = 3.00总是使用64位整数变量,它不依赖于体系结构!它只取决于bash版本.

以前版本的bash总是使用32位整数,即使在64位操作系统上也是如此.