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ループは静的項目のリストを繰り返します。 3つのループのそれぞれでは、リストには1つのエントリしか含まれていません。

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。次に、リストから3つの項目を削除できないまで繰り返し、各反復ごとにタスクの最初の項目を使用します。

task03つのバックグラウンドタスクをすべて使用できます。

x=0; task0 &
x=1; task0 &
x=2; task0 &
wait

関連情報