我有以下设置:
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
单个元素。$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