无法在 for 循环结束时退出 bash 脚本
Cannot exit bash script at the end of the for cycle
我写了一个简单的基于 ping 的 IP 扫描器(见下文),但是它有问题。
#!/bin/bash
counter = 0
for ip in 192.168.44.{1..254}; do
ping -c 1 -W 1 $ip | grep "64 bytes" &
let counter++
if [[ "$counter" -eq 254 ]];
then
exit 0;
fi
done
首先,for 循环似乎启动了多个线程,终端的唯一输出是 ping 应答。但是,当脚本完成对网络中所有机器的 ping 操作后,它永远不会退出,如下图所示:
我必须按 Enter
才能结束它。
我也试过在 done
语句之后放置一个 exit 0
,但它仍然不起作用。如何在for循环结束时让脚本退出?
注意:我发现这个实现是在 LAN 中查找现有机器最快的,但是如果有人有更合适的代码建议,我会感激不尽
你可以试试这个:
#!/bin/bash
for ip in 192.168.44.{1..254}; do
ping -c 1 -W 1 $ip | grep "64 bytes" &
done
wait
假设你不想使用专门的网络扫描工具,你可以使用bash或xargs并行遍历所有地址:
Bash:
#! /bin/bash -x
for ip in 192.168.44.{1..254}; do
ping -c 1 -W 1 $ip | grep "64 bytes" &
done
# Wait for all children to finish
wait
或者使用 xargs,其优点是您可以控制被 ping 的并行地址的数量(在此示例中为 20 个)- 避免因大量并发进程而使您的服务器过载。
echo 192.168.44.{1..254} | xargs --max-args=1 -P20 ping -c 1 -W 1
如果CTRLc可以接受:
parallel -j0 --lb ping ::: 192.168.1.{1..250}
我写了一个简单的基于 ping 的 IP 扫描器(见下文),但是它有问题。
#!/bin/bash
counter = 0
for ip in 192.168.44.{1..254}; do
ping -c 1 -W 1 $ip | grep "64 bytes" &
let counter++
if [[ "$counter" -eq 254 ]];
then
exit 0;
fi
done
首先,for 循环似乎启动了多个线程,终端的唯一输出是 ping 应答。但是,当脚本完成对网络中所有机器的 ping 操作后,它永远不会退出,如下图所示:
我必须按 Enter
才能结束它。
我也试过在 done
语句之后放置一个 exit 0
,但它仍然不起作用。如何在for循环结束时让脚本退出?
注意:我发现这个实现是在 LAN 中查找现有机器最快的,但是如果有人有更合适的代码建议,我会感激不尽
你可以试试这个:
#!/bin/bash
for ip in 192.168.44.{1..254}; do
ping -c 1 -W 1 $ip | grep "64 bytes" &
done
wait
假设你不想使用专门的网络扫描工具,你可以使用bash或xargs并行遍历所有地址: Bash:
#! /bin/bash -x
for ip in 192.168.44.{1..254}; do
ping -c 1 -W 1 $ip | grep "64 bytes" &
done
# Wait for all children to finish
wait
或者使用 xargs,其优点是您可以控制被 ping 的并行地址的数量(在此示例中为 20 个)- 避免因大量并发进程而使您的服务器过载。
echo 192.168.44.{1..254} | xargs --max-args=1 -P20 ping -c 1 -W 1
如果CTRLc可以接受:
parallel -j0 --lb ping ::: 192.168.1.{1..250}