나는 다음과 같은 설정을 가지고 있습니다 :
x=0
y=1
z=2
task0(){
for file in "${files_array[$x]}"
do
sed -i "$var" $file
x=$((x+3))
done
}
task1(){
for file in "${files_array[$y]}"
do
sed -i "$var" $file
y=$((y+3))
done
}
task2(){
for file in "${files_array[$z]}"
do
sed -i "$var" $file
z=$((z+3))
done
}
task0 &
task1 &
task2 &
task0, task1 및 task2 함수는 백그라운드에서 실행되지만 루프당 한 번만 반복됩니다. $files_array[] 끝까지 반복해야 합니다. $files_array[]가 잘 채워지고 함수가 이를 올바르게 읽습니다. 내 실수는 어디에 있습니까?
감사하고 감사합니다, 제인
답변1
일반 for
루프는 정적 항목 목록을 반복합니다. 세 개의 루프 각각에서 목록에는 항목이 하나만 포함됩니다.
task0
예를 들어 에서는 목록의 개별 요소를 반복합니다 .$x
file_array
while
대신 루프를 사용할 수도 있습니다 .
task0 () {
X=${#file_array[@]}
while [ "$x" -lt "$X" ]; do
sed -i -e "$var" "${file_array[$x]}"
x=$(( x + 3 ))
done
}
또는산술 for
루프:
task0 () {
X=${#file_array[@]}
for (( i=x; i < X; i+=3 )); do
sed -i -e "$var" "${file_array[$i]}"
done
}
이러한 루프는 file_array
요소를 제거하거나 요소를 순서대로 설정하지 않는 한 배열에 일반적으로 인접한 인덱스가 있다고 가정합니다.
또한 희소 색인 문제를 방지하기 위해 다음과 같은 파일 목록을 사용할 수도 있습니다.
task0 () {
set -- "${file_array[@]}"
shift "$x"
while true; do
sed -i -e "$var" "$1"
shift 3 || break
done
}
이는 위치 매개변수를 파일 목록으로 설정합니다. 그러면 상황에 따라 0개, 1개, 3개의 항목이 제거됩니다 $x
. 그런 다음 목록에서 세 개의 항목을 제거할 수 없을 때까지 반복하고 각 반복마다 작업의 첫 번째 항목을 사용합니다.
task0
세 가지 백그라운드 작업을 모두 사용할 수 있습니다 .
x=0; task0 &
x=1; task0 &
x=2; task0 &
wait