You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash并行遍历3个数组插入数据库出现死循环与重复行如何解决

问题根因

你当前使用三层嵌套for循环的写法会生成三个数组元素的笛卡尔积,即每个数组的每一个元素都会和另外两个数组的所有元素组合插入,自然会产生大量重复数据,若数组元素数量较多还会出现循环运行时间极长、看起来永不终止的现象。

修复方案

要实现取三个数组对应下标的元素并行遍历,改为按数组索引遍历即可,修改后代码如下:

# readarray加-t参数去除每行末尾的换行符,避免插入数据带多余换行
readarray -t rows1 < /tmp/tempfile1
readarray -t rows2 < /tmp/tempfile2
readarray -t rows3 < /tmp/tempfile3

# 可选:提前校验三个数组长度是否一致,避免下标越界
if [ ${#rows1[@]} -ne ${#rows2[@]} ] || [ ${#rows1[@]} -ne ${#rows3[@]} ]; then
    echo "三个临时文件行数不一致,终止执行"
    exit 1
fi

# 按索引遍历数组,每次取相同下标的三个元素
for ((idx=0; idx<${#rows1[@]}; idx++)); do
    i=${rows1[idx]}
    j=${rows2[idx]}
    k=${rows3[idx]}
    mysql --user=$DB_USER --password=$DB_PASSWD $DB_NAME << EOF
INSERT INTO $TABLE (`column1`,`column2`,`column3`) VALUES ("$i","$j","$k");
EOF
done
注意事项
  • 必须保证/tmp/tempfile1、/tmp/tempfile2、/tmp/tempfile3三个文件的行数完全一致,否则短数组的后段下标会取不到有效值
  • 若数据量较大,可将所有INSERT语句拼接成一次批量插入,减少和MySQL的交互次数,大幅提升插入效率

内容的提问来源于stack exchange,提问作者Paul Bergström

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:54:04