큰 인덱스가 있는 bash 배열을 시작하면 어떻게 되나요?

큰 인덱스가 있는 bash 배열을 시작하면 어떻게 되나요?

bash "다차원" 배열을 만들려고 하는데 연관 배열을 사용하는 아이디어를 보았지만 가장 쉬운 방법은 다음과 같습니다.

for i in 0 1 2
do 
    for j in 0 1 2
    do
        a[$i$j]="something"
    done
done

값을 설정하고 가져오는 것은 쉽지만 bash가 인덱스 00부터 22까지 순차적으로 요소에 공간을 할당하는 경우(즉, 위치 {0,1,2,3,4,...,21,22}를 할당한다는 의미), 그렇지 않습니다. 실제 요소 집합: {00,01,02,10,11,...,21,22}.

인덱스 "n"으로 bash 배열을 시작하면 무슨 일이 일어나는지 궁금합니다. 인덱스 0부터 n까지 충분한 공간을 할당합니까, 아니면 n번째 요소 범주를 별도로 할당합니까?

답변1

bash의 배열 인덱싱과 ksh의 배열 인덱싱(bash의 배열 디자인 복제)은 모든 산술 표현식이 될 수 있습니다.

에서는 및 변수가 확장되어 는 산술 표현식 으로서 bash에서 8진수 1을 표현 a[$i$j]="something"하는 것이 됩니다 . 그러면 과 동일 합니다 . 당신은 얻을 것이다 및 .$i$ji=0 j=1a[01]="something"01i=0 j=10a[010]="something"a[8]="something"a[110]="something"x=11 y=0x=1 y=10

이제 이것이 당신이 원하는 것이 아니라는 것이 분명해졌습니다.

대신 C에서처럼 2D 배열(행렬)로 작업할 수 있습니다.

matrix_size=3
for (( i = 0; i < matrix_size; i++ )) {
  for (( j = 0; j < matrix_size; j++ )) { 
    a[i * matrix_size + j]="something"
  }
}

( for (( ...; ...; ...))ksh93에서 복사된 C와 유사한 구성).

또는 다차원 배열을 지원하는 ksh93으로 전환하십시오.

for (( i = 0; i < 3; i++ )) {
  for (( j = 0; j < 3; j++ )) { 
    a[i][j]="something"
  }
}

키가 문자열인 연관 배열을 사용하여 다차원 배열을 구현할 수도 있습니다.

typeset -A a
for (( i = 0; i < 3; i++ )) {
  for (( j = 0; j < 3; j++ )) { 
    a[$i,$j]="something"
  }
}

보고서에 따르면 세 가지 모두에서 얻는 결과 변수는 다음과 같습니다 typeset -p.

  1. declare -a a=([0]="something" [1]="something" [2]="something" [3]="something" [4]="something" [5]="something" [6]="something" [7]="something" [8]="something")
    
  2. typeset -a a=((something something something) (something something something) (something something something) )
    
  3. declare -A a=([0,2]="something" [0,1]="something" [0,0]="something" [2,1]="something" [2,0]="something" [2,2]="something" [1,2]="something" [1,0]="something" [1,1]="something" )
    

이제 주제의 질문에 대답하려면 ksh와 마찬가지로 bash에서도 일반 배열이 희박합니다. 즉, 정의하지 않고 정의할 수 있으므로 C a[n]나 대부분의 다른 언어 배열 또는 셸과 다릅니다.a[0]a[n-1]

원래 ksh에서 배열 인덱스 제한은 4095였으므로 최대 64x64 크기의 행렬을 가질 수 있었지만 이 제한은 이후 4,194,303으로 늘어났습니다. ksh93에서는 이렇게 하면 a[4194303]=132MiB 이상의 메모리가 할당된다는 것을 알 수 있습니다. 4194304 64비트 포인터와 약간의 오버헤드가 절약되는 것 같습니다. 반면 bash배열 인덱스가 9223372036854775807만큼 높을 수 있는 ksh93에서는 이런 일이 발생하지 않는 것 같습니다(적어도 GNU/Linux amd64)) 실제 설정 요소를 저장하는 데 필요한 것보다 더 많은 메모리를 할당하지 않습니다.

배열((t)csh, zsh, rc, es, fish...)을 지원하는 다른 모든 셸에서 배열 인덱스는 0 대신 1에서 시작하고 배열은 대소문자 없이 설정할 수 없는 일반적인 비희소 배열입니다. 빈 문자열로 설정되어 있어도 a[2]설정 됩니다 .a[1]

대부분의 프로그래밍 언어와 마찬가지로 Bash의 연관 배열은 순서나 계층 개념 없이 해시 테이블로 구현됩니다( typeset -p위에서 무작위 순서로 표시되는 것을 볼 수 있습니다).

다양한 셸의 배열 설계에 대한 자세한 내용은 다음을 참조하세요.이 답변도착하다어레이에 대한 테스트 셸 지원.

관련 정보