다음과 같은 목록이 있습니다.
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
$1
a1
$1
a
위의 두 코드는 모두 동일한 출력을 생성합니다.
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
결과: