for 루프의 배경은 한 번만 반복됩니다.

for 루프의 배경은 한 번만 반복됩니다.

나는 다음과 같은 설정을 가지고 있습니다 :

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예를 들어 에서는 목록의 개별 요소를 반복합니다 .$xfile_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

관련 정보