bash 在“for do () & wait”循环中共享数组

bash 在“for do () & wait”循环中共享数组

我对下面的脚本有疑问。它在 for 循环中使用一些 sql 语句来设置变量并生成日志文件。当前数据库产生 +- 1200 行输出。

原始版本带有注释的 echo 行,它为每个循环(一次写入磁盘的操作)向文本文件 (report.csv) 添加一行。

新的预期版本会将数据附加到数组 (dcimlog),然后对 newreport.csv 中的整个数据集仅执行一次写入操作。

我的问题是,不知何故,子进程未正确附加数组,因此 newreport.csv 仅包含 for 循环之前完成的第一行,并且不由任何子进程附加。

行的顺序并不重要,但执行的速度很重要,因此“do () &”——我相信这可能是失败的原因......

知道如何让它发挥作用吗?

N=$(nproc)
dcimlog=();dcimlog=("${dcimlog[@]}" "一些东西") # 有效
对于“${sqlanswer[@]}”中的 i;做
    ( echo somework #从sql中获取数据
    # echo "$DDeviceID;$NBPort;$PortNumber;$CConnectedDevice;$Connectedport;$CabinetLocation;$HeightDevice;$PositionDevice;$ZoneName;$DataCenterName" >> reports.csv
    dcimlog=("${dcimlog[@]}" "$DDeviceID;$NBPort;$PortNumber;$CConnectedDevice;$Connectedport;$CabinetLocation;$HeightDevice;$PositionDevice;$ZoneName;$DataCenterName") # 不起作用
) &
    if [[ $(jobs -r -p | wc -l) -gt $N ]];然后
            等待-n
完毕
等待
echo "${dcimlog[@]}" > newreport.csv

答案1

考虑将整个循环的标准输出重定向到文件report.csv,并且在内部,就像echo您之前所做的那样。喜欢

for i in "${sqlanswer[@]}"; do
    ( echo somework #get the data from sql
      echo "$DDeviceID;$NBPort;$PortNumber;$CConnectedDevice;$Connectedport;$CabinetLocation;$HeightDevice;$PositionDevice;$ZoneName;$DataCenterName"
    ) &
  done > report.csv

相关内容