
예를 들어, 파일을 참조하는 배열이 2개 있습니다.
alpha=file 1
beta=file2
Charlie=file3
delta=file4
beta2=file5
beta3=file6
Charlie2=file7
charlie3=file8
delta2=file9
delta3=file10
array1=("$alpha" "$beta" "$Charlie" "$delta)
array2=("$beta2" "$beta3" "$Charlie2" "$Charlie3" "$delta1 "$delta3")
그런 다음 이러한 파일 예제를 반복하여 함께 사용하는 알고리즘이 있습니다.
for ((i=0;2;i++))
do
for((j=0;2;j++))
do
./${array1[$i]}.sh ${array2[$j]}.in
done
done
문제는 array1과 array 2가 일치하기를 원한다는 것입니다.
예를 들어
./file2.sh file5.in
하지만 나는 결코 그렇게 할 수 없었습니다. 왜냐하면 j가 모든 루프에 대해 재설정될 때이기 때문입니다. 이 문제에 대한 해결책은 무엇입니까?
답변1
array1의 첫 번째 항목이 array2의 첫 번째 항목에 해당하도록 하려면 중첩 루프가 필요하지 않습니다. 동일한 인덱스 변수를 사용하면 됩니다.
for i in {0..2}; do
"./${array1[i]}.sh" "${array2[i]}.in"
# ..........^.................^
done
또는 연관 배열을 사용하십시오.
declare -A map=(
[$alpha]=$beta2
[$beta]=$beta3
[$Charlie]=$Charlie2
[$delta]=$Charlie3
)
for key in "${!map[@]}"; do
do_something_with "$key" and "${map[$key]}"
done
답변2
배열 압축 연산자를 원하는 것 같으므로 zsh
여기보다 더 나은 옵션이 될 수 있습니다.bash
$ a=({A..D}) b=({1..10})
$ for i j (${a:^b}) echo $i $j
A 1
B 2
C 3
D 4
$ for i j (${a:^^b}) echo $i $j
A 1
B 2
C 3
D 4
A 5
B 6
C 7
D 8
A 9
B 10
${a:^b}
${a:^^b}
두 개의 배열 입니다지퍼 매개변수 확장운영자. 한 배열에 다른 배열보다 적은 수의 요소가 있을 때 차이가 나타납니다. 이 경우 후자는 더 큰 배열과 일치하도록 더 짧은 배열의 요소를 재사용합니다.
변수를 따옴표로 묶지 않은 채 놔두면 zsh
다른 Bourne과 같은 쉘에서와 같이 불쾌한 부작용이 발생하지 않지만 빈 요소는 여전히 제거됩니다. 따라서 배열에 빈 요소가 포함되어 있는 경우 다음과 같이 작성해야 합니다.
for i j ("${(@)a:^^b}") echo "$i" "$j"