2D bash 배열: 이것이 가능합니까?

2D bash 배열: 이것이 가능합니까?

2D bash 배열을 원하는 경우 이를 N x M수행하는 권장 방법이 있습니까? array1array2요소를 정의하기 위해 사례문을 결합해야 했던 적이 몇 번 있었지만 arrayN이는 매우 서투른 일이었습니다.M

큰 배열을 정의하고 요소 간의 1-1 매핑을 계산하는 것이 가능하다는 것을 알고 있지만 X올바르게 수행하려면 많은 작업이 필요한 것 같습니다.X[something][i,j]

이 작업을 합리적으로 효율적으로 수행할 수 있는 기능 세트가 있습니까? 나는 이것이 Bash가 FORTRAN을 모방하게 만드는 것과 약간 비슷하다는 것을 알고 있습니다.

답변1

언제든지 다차원 배열을 사용하는 배열로 전환할 수 있습니다 ksh93( bash처음에는 대부분의 항목이 해당 구문을 차용함).

var=(
  (a b)
  (c d)
)

사용:

$ print -r -- "${var[0][1]}"
b

모든 요소를 ​​반복합니다.

for i in "${!var[@]}"; do
  for j in "${!var[$i][@]}"; do
    print -r "var[$i,$j]=${var[$i][$j]}"
  done
done

답변2

1차원 연관 배열(awk의 방식 [1])을 사용하여 다차원 배열을 시뮬레이션하거나 인덱스를 이동하여 인덱스 배열을 시뮬레이션할 수 있습니다.

문제는 명확하고 자연스러운 방식으로 반복할 수 없다는 것입니다.

declare -A a  # associative array
i=2; j=3; a[$i,$j]=4; echo ${a[2,3]}

unset a
declare -a a  # indexed array, the default
i=2; j=3; a[i<<16|j]=4; echo ${a[2<<16|3]}

참고하시기 바랍니다,색인Bash의 배열은 다음과 같습니다.부족한; 실제 RAM이나 가상 주소 공간에 빈 슬롯을 생성 a[1<<30]=1하지 않습니다 . 1Gi - 1또한 bash의 인덱스 배열은 다음과 같이 구현되므로이중 연결 리스트, 요소에 대한 무작위 액세스는느리게bash가 외부 명령 경로를 캐싱하는 데 사용하는 것과 동일한 해시 테이블 구현을 사용하는 연관 배열과 비교됩니다.

[1] awk는 표현식을 a[x,y,z]--로 자동 변환합니다. 여기서 a[x SUBSEP y SUBSEP z]기본값은 ( )이고 제어 문자가 키에 표시되어서는 안 됩니다. GNU awk에는 비표준 확장으로 진정한 다차원 배열도 있습니다. 고전적인 awk 다중 차원 배열 에뮬레이션은 Perl( => )에서도 사용할 수 있습니다.SUBSEP\x1c^\$;SUBSEP

관련 정보