일부 설정되지 않은 요소가 있는 배열에 대한 Bash 하위 문자열 확장

일부 설정되지 않은 요소가 있는 배열에 대한 Bash 하위 문자열 확장

설정되지 않은 요소가 있는 bash 배열을 인덱싱할 때 이상한 동작을 발견했습니다. 다음 세 가지 요소로 배열을 만듭니다.

$ arry[3]=a
$ arry[4]=b
$ arry[5]=c

배열이 올바른 것 같습니다.

$ echo ${#arry[@]}
3
$ echo ${!arry[@]}
3 4 5

그러나 배열의 처음 세 값을 얻으려고 하면 a모두 얻습니다.

$ echo ${arry[@]:0:1}
a
$ echo ${arry[@]:1:1}
a
$ echo ${arry[@]:2:1}
a

내가 설정한 요소를 얻으려면 실제 키를 사용해야 합니다.

$ echo ${arry[@]:3:1}
a
$ echo ${arry[@]:4:1}
b
$ echo ${arry[@]:5:1}
c

하위 문자열 확장자 "offset"은 실제 배열 인덱스를 의미하는 것처럼 보입니다. 설정되지 않은 경우 Bash는 설정된 요소를 찾을 때까지 계속 스크롤합니다.

이것을 인정하면, 일부 설정되지 않은 요소가 있는 인덱스 배열의 n번째 값을 얻는 간단한 방법이 있습니까?

답변1

일부 설정되지 않은 요소가 있는 인덱스 배열의 n번째 값을 얻는 직접적인 방법이 있습니까?

임시 배열이 없는 것은 아니라고 생각합니다.

a=([3]=2 [1]=12 [12]=4 [23]=5)

a_indices=("${!a[@]}")

third_element=${a[${a_indices[2]}]}

또는

a_normalized=("${a[@]}")
third_element=${a_normalized[2]}

이것이 ksh의 유산입니다. ksh와 bash는 내가 아는 유일한 배열 희소 쉘입니다(즉, 키가 양의 정수로 제한되고 키를 기준으로 숫자로 정렬되는 연관 배열입니다).

내가 아는 다른 모든 쉘(zsh, yash, fish, csh, tcsh, rc, es...)에 대한 배열은 일반 배열(인덱스는 1부터 시작합니다.0이 아닌 1(적어도 나는)이 예상됩니다.

답변2

~에 따르면Bash의 매개변수 확장

:x이 인덱스에서 끝까지 요소를 반환합니다 .

첫 번째로 추출된 요소를 반환합니다 :x:y.y

그것은 하나의 관점이어야 합니다.

ar[2]=a
ar[3]=b
ar[5]=y
ar[6]=z

echo ${ar[@]:0}
# a b z y

echo ${ar[@]:0:3}
# a b z

echo ${ar[@]:4}
# y z

관련 정보