Bash
後台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[]. $ 文件數組
$$ $$填充得很好,函式可以正確讀取它。我的錯誤在哪裡? 謝謝和問候,揚
一個普通的
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