Bash

後台for循環只循環一次

  • August 10, 2021

我有以下設置:

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[]. $ 文件數組

$$ $$填充得很好,函式可以正確讀取它。我的錯誤在哪裡? 謝謝和問候,揚

一個普通的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

引用自:https://unix.stackexchange.com/questions/664063