【问题标题】:Bash Number Limit?Bash 数量限制?
【发布时间】:2012-12-06 08:42:41
【问题描述】:

我之前问过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 提供的“固定”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)。似乎有什么东西在试图推进,但卡住了。

【问题讨论】:

  • 太棒了,我在 Linux 中发现了我的第一个错误。我将在明天实施修复。感谢您的链接。
  • 实际上,它在较新版本的 bash 中已修复,但并未包含在所有发行版中。
  • 看来这不是问题所在。我从 git 下载了 tar,在我的桌面上编译它,在 bash 脚本中链接到它,然后再次运行它。我稍后会更新我的问题。
  • 您在什么文件系统类型上运行它?看起来您的文件在 2GB 空间左右停止。 FAT32 有 2GB 的文件限制,因此如果您在基于 FAT 的文件系统上运行,它可能根本不是 bash,但您不能再向该文件写入任何内容。

标签: linux bash numbers


【解决方案1】:

不,它与您的操作系统的位大小无关。这取决于 bash 源代码中的一个简单声明。

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

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

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2014-05-04
    相关资源
    最近更新 更多