我对下面的脚本有疑问。它在 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