KSH/BASH 数组的最大大小

KSH/BASH 数组的最大大小

ksh 和 bash 脚本的数组的最大大小是多少?

示例:假设我有一个包含 10 个元素的数组。数组的特定索引可以容纳的最大字符串数是多少?相同的数组的最大大小是多少?

我是 Unix 新手。我想这是一个常见问题,但我没有找到答案,所以我决定在这里问。

答案1

i=0
while true; do
    a[$i]=foo
    i=$((i+1))
    printf "\r%d " $i
done

这个简单的脚本在我的系统(Gnu/Linux 和 Solaris)上显示:

  • ksh88将大小限制为2^12-1(4095)。 ( subscript out of range)。一些较旧的版本(例如 HP-UX 上的版本)将大小限制为1023.

  • ksh93将数组的大小限制为2^22-1(4194303),您的情况可能会有所不同。

  • bash除了可用的底层内存资源所规定的限制外,它不会施加任何硬编码限制。例如,bash 使用1.3 GB虚拟内存来存储大小为 的数组18074340

注意:我放弃了mkshwhich 执行循环太慢(比zsh,ksh93和慢一百倍以上bash。)

答案2

数组的大小没有最大限制,也没有对成员进行连续索引或分配的要求。索引数组使用整数(包括算术表达式(参见 Shell 算术))引用,并且是从零开始的;关联数组使用任意字符串。除非另有说明,索引数组索引必须是非负整数。

http://www.gnu.org/software/bash/manual/html_node/Arrays.html

答案3

这取决于实施。在 ksh 中记录了“实现定义的限制”索引数组。因为ksh88现有系统的限制为 1023,而ksh93实现所需的最小限制为 4095。因此,您不能指望拥有比这更多的可用限制! (如果您仅针对特定系统实施,您可以按照此处另一个答案中的建议测试您的系统限制。)

相关内容