Bash数量限制?

之前我问过一个问题 ,那就是从一个文本文件中提取大的素数,并把它们放到另一个文件中。 本来应该在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 

它结束了这11个数字的循环:

 4232004449 4232004479 4232004493 4232004509 4232004527 4232004533 4232004559 4232004589 4232004593 4232004613 004437 

原来的文件没有004437在里面,我的bash会处理8999999999999999999以上的8999999999999999999

有人知道为什么发生这种情况吗?

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

更新:

在下载并编译jfgagne提供的“固定”bash并链接到我的bash脚本后,它在同一个确切位置出错。 使用从我的原始问题显着更快的perl等价物,我从ls -al得到了一些文件大小:

  11 next_prime (just to make sure this was counting bytes accurately) 2147483659 primes2.txt 2147483670 one_too_many 

2147483659 = 2 ^ 31 + 11

下一个素数( 4232004631 )的大小是11个字节,这个素数达到4232004613 。 我也意识到004437是从这个错误循环底部( 4232004437 )底部的底部开始的。 似乎有些事情正在试图推进,但卡住了。

Solutions Collecting From Web of "Bash数量限制?"

不,它是独立于你的操作系统的比特。 这取决于bash源文件中的一个简单的声明。

自2002年以来,这个声明是__int64_t。从那以后,bash版本> = 3.00总是使用64位整型变量,而且它不依赖于架构! 它只取决于bash版本。

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