我如何并行执行这个嵌套的 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

我希望这段代码以每个 IP 的 echo 命令开始,并行TARGETS执行它们。同时,该脚本并不意味着同时对多个地址执行 echo 命令myIPs,因此我wait在内部循环中引入了这一点。我希望为 中的每个目标并行执行一对echo(每个用于端口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

我发现你的问题很难理解:你似乎想要并行执行和顺序执行。

你想要这个吗?

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 循环都在后台的子 shell 中运行。

答案2

如果我理解正确的话,你应该颠倒两个循环,并将等待放在dones 之间。喜欢

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

对于 中的每个 IP myIPs,它将向这三个端口中的每一个发送一个包含两个端口的数据包TARGETS,然后等待这六个端口完成。

相关内容