Bash는 기본적으로 2차원 배열을 지원하지 않습니다., 하지만 시뮬레이션하고 싶습니다. 최소한의 작업 예로, 두 개의 배열이 있고 a0
다음이 있다고 가정해 보겠습니다 a1
.
a0=(1 2 3 4)
a1=(5 6 7 8)
and 의 세 번째 요소를 for
인쇄하는 루프를 작성하고 싶습니다 . 물론 두 가지 명시적 호출을 사용하여 이 작업을 수동으로 수행할 수 있습니다 .a0
a1
echo
echo ${a0[2]}
echo ${a1[2]}
그러나 나는 for
이것을 루프를 사용하여 요약하고 싶습니다. 어떻게 해야 하나요?
나는 다음을 시도했다:
for i in ${a0[@]} ${a1[@]}
do
echo {$i}[2]
echo ${i[2]}
echo ${i}[2]
echo ${$i[2]}
echo ${${i}[2]}
done
그러나 이러한 시도는 성공하지 못했습니다. 나는 다음과 같은 결과를 얻습니다.
{1}[2]
1[2]
chgreen.sh: line 30: ${$i[2]}: bad substitution
어떤 생각이 있나요?
답변1
당신은 잘못된 것을 반복하고 있습니다. for
배열의 각 요소를 $i
배열의 인덱스가 아닌 로 저장 합니다. 당신이 원하는 것은 다음과 같습니다
#!/usr/bin/env bash
a0=(1 2 3 4)
a1=(5 6 7 8)
for ((i=0;i<${#a0[@]};i++))
do
echo ${a0[$i]} ${a1[$i]};
done
답변2
지금쯤 연구를 통해 알 수 있듯이 bash는 다차원 배열을 지원하지 않습니다.그 자체, 그러나 "연관" 배열을 지원합니다. 기본적으로 숫자가 아닌 문자열로 색인이 생성되므로 예를 들어 다음과 같은 결과를 얻을 수 있습니다.
grade[John]=100
grade[Paul]=100
grade[George]=90
grade[Ringo]=80
연결된 질문에 대한 답변에서 입증되었지만 잘 설명되지는 않았지만 연관 배열의 인덱스에는 쉼표가 포함될 수 있으므로 일반적인 트릭은 개별 인덱스(0-1 × 0-3)를 연결하는 것입니다. 쉼표로 구분된 문자열입니다. 이는 일반 배열보다 더 번거롭지만 다음과 같이 작동합니다.
$statement-A <-- 연관배열을 생성합니다. $a[0,0]=1 $a[0,1]=2 $a[0,2]=3 $a[0,3]=4 $a[1,0]=5 $a[1,1]=6 $a[1,2]=7 $a[1,3]=8 $는 0 1 안에 내가 있나요? > 하다 > 에코 ${a[$i,2]} > 완료 삼 <-- 이것이 출력입니다. 7
답변3
이것은 이상한 접근 방식이지만 일부 상황에서는 유용할 수 있습니다. 문제는 for
루프가 배열을 해당 요소로 구문 분석하고 각 요소를 개별적으로 처리한다는 것입니다.
따라서 배열을 해체하고 다시 만드십시오.
a0=(1 2 3 4)
a1=(5 6 7 8)
a0=${a0[@]} # deconstruction
a1=${a1[@]}
for arr in "$a0" "$a1"; do a=( $arr ); echo ${a[2]}; done
산출
삼
7