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
。
注意:我放弃了mksh
which 执行循环太慢(比zsh
,ksh93
和慢一百倍以上bash
。)
答案2
数组的大小没有最大限制,也没有对成员进行连续索引或分配的要求。索引数组使用整数(包括算术表达式(参见 Shell 算术))引用,并且是从零开始的;关联数组使用任意字符串。除非另有说明,索引数组索引必须是非负整数。
http://www.gnu.org/software/bash/manual/html_node/Arrays.html
答案3
这取决于实施。在 ksh 中记录了“实现定义的限制”索引数组。因为ksh88
现有系统的限制为 1023,而ksh93
实现所需的最小限制为 4095。因此,您不能指望拥有比这更多的可用限制! (如果您仅针对特定系统实施,您可以按照此处另一个答案中的建议测试您的系统限制。)