Bash에서 목록(중첩 목록)을 반복하는 방법은 무엇입니까?

Bash에서 목록(중첩 목록)을 반복하는 방법은 무엇입니까?

다음과 같은 목록이 있습니다.

data = [ ['a', 'b' ], ['a1', 'b1'], ['c1', 'd1' ] ]

각 중첩 목록의 두 요소를 동시에 반복하고 액세스하고 싶습니다.

그것은 다음과 같습니다:

for elements in ??
do
    python3 main.py --argument1 elements[0] --arguments2 elements[1]
done

중첩 목록의 각 요소에 어떻게 액세스합니까?

나는 이것을 시도했습니다 :

a1=( a a1 c1 )
a2=( b b1 d1 )

declare -i i=0

while [ "${a1[i]}" -a "${a2[i]}" ]; do

    printf " %s  %s\n" "${a1[i]}" "${a2[i]}"
    ((i++))

done

exit 0

답변1

에는 목록 목록과 같은 것이 없기 때문에 bash코드에서 나타내는 것처럼 루프에서 두 목록을 쌍으로 반복하려고 한다고 가정합니다. 또한 두 목록 모두 항상 동일한 수의 요소를 포함하고 목록이 희박하지 않다고 가정합니다.

인덱스나 요소 자체를 사용하여 반복하는 루프를 작성할 수 있습니다.

다음 예제에서는 배열 중 하나의 인덱스를 반복하고 이를 사용하여 두 배열의 요소에 액세스하는 방법을 보여줍니다.

a1=( a a1 c1 )
a2=( b b1 d1 )

for i in "${!a1[@]}"; do
        printf 'Pair: (%s,%s)\n' "${a1[i]}" "${a2[i]}"
done

표현식은 "${!a1[@]}"배열 인덱스를 포함하는 목록으로 확장됩니다 a1.

루프에서 직접 배열 요소를 사용할 수도 있습니다.

a1=( a a1 c1 )
a2=( b b1 d1 )

set -- "${a1[@]}"

for b in "${a2[@]}"; do
        a=$1; shift
        printf 'Pair: (%s,%s)\n' "$a" "$b"
done

여기서는 위치 인수 목록을 a1배열의 요소 로 설정 set한 다음 다른 배열의 요소를 반복합니다. 값은 $b루프의 요소이며 첫 번째 위치 인수(다음 요소)입니다. 값이 위치 매개변수 목록에 지정된 다음 위치 매개변수 목록에서 제거됩니다.a2$1a1$1a

위의 두 코드는 모두 동일한 출력을 생성합니다.

Pair: (a,b)
Pair: (a1,b1)
Pair: (c1,d1)

표시되는 코드의 주요 문제점은 빈 요소를 발견했을 때 배열의 끝에 도달했는지 알 수 없다는 것입니다. 배열에는 빈 요소가 허용되어야 합니다. 모호할 수 있으므로 -a구문 내부를 피하고 with로 바꾸는 것이 가장 좋으며 , with가 비어 있지 않은 문자열인지도 테스트해야 합니다.[ ... ][ ... ] && [ ... ]-n

답변2

데이터와 arrnum을 변경할 때 목적에 맞게 다차원 배열을 사용할 수 있습니다.

data=( a b a1 b1 c1 d1 )
arrnum=2
len=${#data[@]}

declare -i i=0

while [ "$len" -gt "$((i*arrnum))" ]; do

    for (( j=0; j<$arrnum-1; j++ )); do
    printf " %s  " "${data[i*arrnum+j]}"
    done
        printf " %s\n" "${data[i*arrnum+j]}"
    
    ((i++))

done

exit 0

결과:

1

관련 정보