后台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

相关内容