私は次の設定を持っています:
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
たとえば、リストの個々の要素を繰り返します。$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
。次に、リストから3つの項目を削除できないまで繰り返し、各反復ごとにタスクの最初の項目を使用します。
task0
3つのバックグラウンドタスクをすべて使用できます。
x=0; task0 &
x=1; task0 &
x=2; task0 &
wait