%20%26amp%3B%20wait%22%20%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%20bash%20%E5%85%B1%E6%9C%89%E9%85%8D%E5%88%97.png)
以下のスクリプトに問題があります。 forループのSQL文を使用して変数を設定し、ログファイルを生成します。現在のデータベースは+ - 1200行の出力を生成します。
元のバージョンには、各ループ(ディスクに対する書き込み操作)ごとにテキストファイル(report.csv)に1行を追加するコメント付きエコー行があります。
新しい予想バージョンはデータを配列(dcimlog)に追加し、newreport.csvのデータセット全体に対して1回の書き込み操作のみを実行します。
私の問題は、どういうわけかサブプロセスが配列を正しく追加しないため、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
前と同様に、ループ全体の標準出力をファイルに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