2D bash 배열을 원하는 경우 이를 N x M
수행하는 권장 방법이 있습니까? array1
각 array2
요소를 정의하기 위해 사례문을 결합해야 했던 적이 몇 번 있었지만 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