このネストされたforループをどのように並列に実行できますか?

このネストされたforループをどのように並列に実行できますか?
#!/usr/bin/bash

TARGETS=(
"81.176.235.2"
"81.176.70.2" 
"78.41.109.7" 
)

myIPs=(
"185.164.100.1"
"185.164.100.2"
"185.164.100.3"
"185.164.100.4"
"185.164.100.5"
)

for t in "${TARGETS[@]}"
  do 
    for a in "${myIPs[@]}"
    do 
      echo "${a} ${t} -p 80" >>log 2>&1 &
      echo "${a} ${t} -p 443" >>log 2>&1 &
      wait
    done 
    
done

TARGETSこのコードは各IPに対してechoコマンドで始まり、並列に実行したいと思います。また、スクリプトは同時に複数のアドレスにコマンドをエコーすることを意図していないmyIPsのでwait、これを内部ループに導入しました。 .NETの各ターゲットに対してペアecho(ポートごとに1つ、それぞれ1つ)を並列に実行したいと思います80。つまり、私はこれをしたいのですが(残念ながら動作しません)。443TARGETS

for t in "${TARGETS[@]}"
do &
  for a in "${myIPs[@]}"
  do 
    echo "${a} ${t} -p 80" >>log 2>&1 &
    echo "${a} ${t} -p 443" >>log 2>&1 &
    wait
  done 

done
wait 

ただし、負荷平均が大きくなりすぎるため、次のことは望ましくありません。

for t in "${TARGETS[@]}"
do
  for a in "${myIPs[@]}"
  do 
    echo "${a} ${t} -p 80" >>log 2>&1 &
    echo "${a} ${t} -p 443" >>log 2>&1 &
  done 
done
wait 

私の目標をどのように達成できますか?

PS これは、より複雑なスクリプトの一部にすぎません。関連する問題を分離したかったので、代わりにechoネットワークコマンドの1つを使用しました。

ベストアンサー1

ご質問がわかりにくいと思います。並列実行とシーケンシャル実行が欲しいようです。

あなたはこれをしたいですか?

for t in "${TARGETS[@]}"; do 
  (
    for a in "${myIPs[@]}"; do 
      echo "${a} ${t} -p 80" >>log 2>&1 &
      echo "${a} ${t} -p 443" >>log 2>&1 &
      wait
    done 
  ) & 
done

各ターゲットの for ループは、バックグラウンドのサブシェルで実行されます。

おすすめ記事