ksh 및 bash 스크립트의 최대 배열 크기는 얼마입니까?
예: 10개의 요소로 구성된 배열이 있다고 가정합니다. 배열의 특정 인덱스가 보유할 수 있는 최대 문자열 수는 얼마입니까? 동일한 배열의 최대 크기는 얼마입니까?
저는 유닉스를 처음 접했습니다. 흔한 질문인 것 같은데 답변이 없어서 여기에 질문하게 되었습니다.
답변1
i=0
while true; do
a[$i]=foo
i=$((i+1))
printf "\r%d " $i
done
이 간단한 스크립트는 내 시스템(Gnu/Linux 및 Solaris)에 표시됩니다.
ksh88
크기를 (4095)로 제한합니다2^12-1
. (subscript out of range
). 일부 이전 버전(예: HP-UX 버전)은 크기를1023
.ksh93
배열 크기를2^22-1
(4194303)로 제한하십시오. 상황이 다를 수 있습니다.bash
사용 가능한 기본 메모리 리소스에 의해 지정된 것 외에는 하드 코딩된 제한을 적용하지 않습니다. 예를 들어, bash는1.3 GB
가상 메모리를 사용하여 크기 배열을 저장합니다18074340
.
mksh
참고: 너무 느린 루프( zsh
, 및 . 보다 ksh93
100배 이상 느림 )의 실행을 포기했습니다 .bash
답변2
배열 크기에는 최대 제한이 없으며, 멤버를 연속적으로 인덱싱하거나 할당해야 한다는 요구 사항도 없습니다. 인덱스 배열은 정수 참조(산술 표현식 포함(쉘 산술 참조))를 사용하고 연관 배열은 임의 문자열을 사용합니다. 달리 명시하지 않는 한, 인덱스 배열 인덱스는 음수가 아닌 정수여야 합니다.
http://www.gnu.org/software/bash/manual/html_node/Arrays.html
답변3
구현에 따라 다릅니다. "구현 정의 제한"은 ksh에 문서화되어 있습니다.인덱스 배열. ksh88
기존 시스템의 한도는 1023이고, ksh93
구현에 필요한 최소 한도는 4095이기 때문 입니다. 따라서 이보다 더 많은 사용 가능한 제한이 있을 것으로 기대할 수 없습니다! (특정 시스템에 대해서만 이를 구현하는 경우 여기의 다른 답변에 제안된 대로 시스템 제한 사항을 테스트할 수 있습니다.)