之前我问过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
)底部的素数末尾。似乎有些事情正在努力推进,但却陷入困境。
答案 0 :(得分:5)
不,它独立于您操作系统的比特尺。这取决于bash源中的一个简单声明。
此声明自2002年左右起__int64_t。从那时起,bash版本&gt; = 3.00始终使用64位整数变量,并且它不依赖于体系结构!它只取决于bash版本。
以前版本的bash总是使用32位整数,即使在64位操作系统上也是如此。