Bash数量限制?

时间:2012-12-06 08:42:41

标签: linux bash numbers

之前我问过a question涉及从文本文件中提取大素数并将它们放入另一个文件中。它应该在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以上的数字

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

  

64位Ubuntu 10.04,16GB RAM,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

2147483659 = 2 ^ 31 + 11

下一个素数(4232004631)的大小为11个字节 这使得所有素数都达到4232004613。我还意识到004437来自此错误循环(4232004437)底部的素数末尾。似乎有些事情正在努力推进,但却陷入困境。

1 个答案:

答案 0 :(得分:5)

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

此声明自2002年左右起__int64_t。从那时起,bash版本&gt; = 3.00始终使用64位整数变量,并且它不依赖于体系结构!它只取决于bash版本。

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