"for do () & wait" 루프의 bash 공유 배열

"for do () & wait" 루프의 bash 공유 배열

아래 스크립트에 문제가 있습니다. for 루프의 일부 SQL 문을 사용하여 변수를 설정하고 로그 파일을 생성합니다. 현재 데이터베이스는 +- 1200줄의 출력을 생성합니다.

원본 버전에는 각 루프(디스크에 대한 한 번의 쓰기 작업)에 대해 텍스트 파일(report.csv)에 한 줄을 추가하는 주석 처리된 에코 줄이 있습니다.

새로운 예상 버전은 데이터를 배열(dcimlog)에 추가한 다음 newreport.csv의 전체 데이터 세트에 대해 한 번의 쓰기 작업만 수행합니다.

내 문제는 어떻게든 하위 프로세스가 배열을 올바르게 추가하지 않아서 newreport.csv에 for 루프 이전에 완료된 첫 번째 행만 포함되고 하위 프로세스에 의해 추가되지 않는다는 것입니다.

줄의 순서는 중요하지 않지만 실행 속도는 중요하므로 "do () &" - ​​이것이 실패의 원인일 수 있다고 생각합니다...

어떻게 작동하게 만들 수 있는지 아시나요?

N=$(nproc)
dcimlog=();dcimlog=("${dcimlog[@]}" "뭔가") # 유효함
나는 "${sqlanswer[@]}"에서 수행합니다.
    (echo somework #SQL에서 데이터 가져오기
    # echo "$DDeviceID;$NBPort;$PortNumber;$CConnectedDevice;$Connectedport;$CabinetLocation;$HeightDevice;$PositionDevice;$ZoneName;$DataCenterName" >> 보고서.csv
    dcimlog=("${dcimlog[@]}" "$DDeviceID;$NBPort;$PortNumber;$CConnectedDevice;$Connectedport;$CabinetLocation;$HeightDevice;$PositionDevice;$ZoneName;$DataCenterName") # 작동하지 않음
)&
    if [[ $(jobs -r -p | wc -l) -gt $N ]];
            잠깐만요
    필리핀 제도
완벽한
기다리다
echo "${dcimlog[@]}" > newreport.csv

답변1

이전 과 마찬가지로 전체 루프의 표준 출력을 file 로 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

관련 정보